2011-02-15 18 views
6

¿Cómo funciona exactamente fork()?fork() proceso de ejecución

El código

#include <stdio.h> 

int main (int argc, char const *argv[]) 
{ 
printf("Hi\n"); 
int i; 
for(i = 1; i < argc; i++) 
{ 
    printf("Argument %d is %s\n", i, argv[i]); 
    fork(); 
    printf("Forked in for loop increment %d\n", i); 
} 


return 0; 
} 

siguiente da la siguiente salida

/a.out hola mundo

Argumento 1 es hola

ahorquillada por incremento bucle 1

Argumento 2 es mundo

ahorquillada por incremento bucle 2

ahorquillada por incremento bucle 1

Argumento 2 es mundo

ahorquillada por incremento bucle 2

bifurcada en bucle for incremento 2

¿Qué código ejecuta fork primero, en gener Alabama. Me gustaría conocer los principios de fork() en lugar de solo este ejemplo. Pude haber tenido múltiples argumentos en la línea de comando.

Respuesta

9

fork es una llamada al sistema, es decir, una rutina de biblioteca que llama al kernel. Al dar servicio a una llamada fork, el kernel crea un nuevo proceso que ejecuta el mismo programa que el proceso que lo llamó. El nuevo proceso comienza a ejecutarse como si fuera llamara fork; el valor de retorno es diferente al del padre, por lo que puede distinguir los dos.

El idioma común para invocar fork es:

pid_t pid = fork(); 

switch (pid) { 
    case -1: 
    /* an error occurred, i.e. no child process created */ 
    handle_error(); 
    case 0: 
    /* a return value of 0 means we're in the child process */ 
    do_child_stuff(); 
    break; // or _exit() 
    default: 
    /* we're in the parent; pid is the child's process id */ 
    do_parent_stuff(); 
} 

Cómo funciona esto es: el sistema operativo hace una copia casi perfecta del proceso llamando fork (el PID y algunos otros valores son diferentes, pero los contenidos de la memoria comienzan prácticamente de la misma manera y generalmente se abren los mismos archivos en ambos). La copia se realiza comúnmente utilizando la llamada semántica copy-on-write (COW), por lo que apenas se realiza una copia real hasta que uno de los procesos comienza a asignar variables.

+0

Así que mis salidas de la impresión que me son engañosas. Una bifurcación() en un bucle for es extraño ¿verdad? – jarryd

+2

El orden de salida en su programa no es determinista. Un 'fork' en un bucle no es tan extraño (es posible que desee crear un * n * número de procesos de trabajo), pero un' 'bifurcación' 'desnudo donde el hijo y el padre ejecutan el mismo código es bastante raro. La mayoría de las veces, un 'tenedor' es solo una preparación para una llamada a' exec'. –

+1

@ Helium3 Lo que es raro es el código que no almacena el valor de retorno de fork en una variable llamada algo así como childpid y luego hace cosas diferentes dependiendo de si es 0 (en el niño), positivo (en el padre), o negativo (falla). Esto puede suceder en un ciclo o no. –

3

Tenga en cuenta que el número de procesos crecerá exponencialmente, por lo que para 100 argumentos estamos hablando de los procesos 1267650600228229401496703205376. Espero que tengas una PC realmente fuerte :).

Voy a responder a su comentario aquí, tal vez lo ayude a entender el tenedor.

Después de cada ciclo, duplicará el número de procesos. Entonces después de N bucles terminará con 2^N proceso. O después de 100 bucles terminará con ese gran número que te di.

Por cierto, fork bombs son uno de los más comunes DoS ataques alrededor :)

+0

Fue una exageración. ;) ¿cómo se llega a ese número? – jarryd

+0

Cada argumento dobla la cantidad de procesos bifurcados. Entonces terminarás con 2^n procesos. Durante mucho tiempo, la mayoría de los sistemas operativos no podían administrar más de 2^16 procesos a la vez, debido al simple hecho de que el ID del proceso (PID) solía ser un número de 16 bits. E incluso si el sistema operativo de hoy utiliza principalmente tipos de 32 bits para el PID, a menudo hay un límite de 2^16 en su lugar. Pero rara vez se generan más de 1000 procesos en un sistema a la vez. – datenwolf

+0

Gracias por la información. @Klark: enlace fork bombas fue interesante gracias. – jarryd

Cuestiones relacionadas