2009-03-06 21 views

Respuesta

5

fork() solo existe en sistemas Unix y crea un nuevo proceso con el mismo estado que el llamador. CreateThread() crea un nuevo hilo en el mismo proceso.

+2

Windows NT, 2000 etc. soportan posix y, por lo tanto, admiten fork http://www.robelle.com/smugbook/process.html –

+0

Wow. ¿Por qué no se menciona en MSDN? – sharptooth

+0

mencionado aquí http://support.microsoft.com/kb/149902. Aunque parece que se ha eliminado de forma predeterminada en winXP (ha pasado un tiempo desde que he c'ed en Windows) http://support.microsoft.com/kb/308259 –

1

CreateThread - es para hilos, horquilla - es para crear procesos duplicados. Y no hay una forma nativa de tener la funcionalidad de fork para Windows (al menos a través de Win32).

+1

Ninguna forma nativa es una forma incómoda de expresarlo, ya que es la NT Native API que permite exactamente eso. Adivina cómo se implementaron el antiguo subsistema POSIX y ahora SFU/SUA;) ... echa un vistazo al libro "Windows NT/2000 Native API" de Nebbett, incluye una implementación de ejemplo de 'fork()'. – 0xC0000022L

10

En NT, la unidad de trabajo fundamental se denomina subproceso (es decir, NT programa subprocesos, no procesos). Los hilos de usuario se ejecutan en el contexto de un proceso. Cuando llamas a CreateThread, solicitas al kernel de NT que asigne una unidad de trabajo dentro del contexto de tu proceso (también tienes fibras que son básicamente hilos que puedes programar tú mismo pero que van más allá del tema de tu pregunta).

Cuando llama a CreateThread proporciona la función con un punto de entrada que se ejecutará después de que se llame a la función. El código debe estar dentro del espacio virtual del proceso y la página debe tener derechos de ejecución. En pocas palabras, le da un puntero a la función. ;)

fork() es una función de UNIX que solicita al kernel que cree una copia del proceso en ejecución. El proceso principal obtiene el pid del proceso secundario y el proceso secundario obtiene 0 (de esta manera usted sabe quién es).

Si desea crear un proceso en Windows, llame a la función CreateProcess, pero eso no se comporta como fork(). La razón es que la mayoría de las veces crearás hilos, no procesos.

Como puede ver, no hay relación entre CreateThread y fork.

+2

* Si desea crear un proceso en Windows, llame a la función CreateProcess, pero eso no se comporta como fork(). La razón es que la mayoría de las veces crearás hilos, no procesos. * Cuál se usa es la consecuencia de la diferencia entre los dos, no es la razón :) –

1

El modelo de proceso de Windows y Unix es fundamentalmente muy diferente, por lo que no hay forma de asignar directamente la API de una encima de la otra.

fork() clona el proceso actual en dos. En el proceso padre, tenedor() devuelve el pid, y en el niño devuelve 0. Esto se utiliza normalmente como esto:

int pid; 
if (pid = fork()) { 
    // this code is executed in the parent 
} else { 
    // this code is executed in the child 
} 

Cygwin es una capa de emulación para crear y ejecutar aplicaciones Unix en Windows, que emula el comportamiento de la horquilla() usando CreateProcess().

+1

Creo que etiquetaste los bloques incorrectamente, como el proceso * child * obtiene 0 y el padre obtiene el PID del niño. –

+0

Sí, gracias. Corregido ahora. (Impresionante que esto pasó desapercibido por más de un año). – JesperE

1

Es posible que desee saber Microsoft proporciona tenedor() en las versiones de gama alta de las ventanas con componente llamado Subsistema para aplicaciones basadas en UNIX (SUA). Puede encontrar detalles en mi respuesta here.