logo

bifurcación() en C

La llamada al sistema Fork se utiliza para crear un nuevo proceso en sistemas Linux y Unix, que se denomina proceso hijo , que se ejecuta simultáneamente con el proceso que realiza la llamada fork() (proceso padre). Después de crear un nuevo proceso hijo, ambos procesos ejecutarán la siguiente instrucción después de la llamada al sistema fork().

El proceso hijo utiliza la misma PC (contador de programa), los mismos registros de CPU y los mismos archivos abiertos que se utilizan en el proceso padre. No toma parámetros y devuelve un valor entero.



A continuación se muestran diferentes valores devueltos por fork().

  • Valor negativo : La creación de un proceso hijo no tuvo éxito.
  • Cero : Retornado al proceso hijo recién creado.
  • Valor positivo : Devuelto al padre o a la persona que llama. El valor contiene el ID del proceso hijo recién creado.

creando un proceso de bifurcación

Nota: fork() es una función basada en subprocesos; para obtener el resultado correcto, ejecute el programa en un sistema local.



Tenga en cuenta que los programas anteriores no se compilan en un entorno Windows.

Ejemplo de bifurcación() en C

C




patrón de diseño del método de fábrica



#include> #include> #include> int> main()> {> > >// make two process which run same> >// program after this instruction> >pid_t p = fork();> >if>(p<0){> >perror>(>'fork fail'>);> >exit>(1);> >}> >printf>(>'Hello world!, process_id(pid) = %d '>,getpid());> >return> 0;> }>

>

>

Producción

Hello world!, process_id(pid) = 31 Hello world!, process_id(pid) = 32>

Ejemplo 2: Calcule el número de veces que se imprime hola.

C




#include> #include> #include> int> main()> {> >fork();> >fork();> >fork();> >printf>(>'hello '>);> >return> 0;> }>

>

>

Producción

hello hello hello hello hello hello hello hello>

Explicación

La cantidad de veces que se imprime 'hola' es igual a la cantidad de procesos creados. Número total de procesos = 2norte, donde n es el número de llamadas al sistema fork. Entonces aquí n = 3, 23= 8 Pongamos algunos nombres de etiquetas para las tres líneas:

fork (); // Line 1 fork (); // Line 2 fork (); // Line 3 L1 // There will be 1 child process /  // created by line 1. L2 L2 // There will be 2 child processes /  /  // created by line 2 L3 L3 L3 L3 // There will be 4 child processes // created by line 3>

Entonces hay un total de ocho procesos (procesos secundarios nuevos y un proceso original). Si queremos representar la relación entre los procesos como una jerarquía de árbol sería la siguiente: El proceso principal: P0 Procesos creados por el 1er fork: P1 Procesos creados por el 2do fork: P2, P3 Procesos creados por el 3er fork: P4, P5, P6, P7

 P0 / |  P1 P4 P2 /   P3 P6 P5 / P7>

Ejemplo 3: predecir el resultado del siguiente programa.

C




#include> #include> #include> #include> void> forkexample()> {> >pid_t p;> >p = fork();> >if>(p<0)> >{> >perror>(>'fork fail'>);> >exit>(1);> >}> >// child process because return value zero> >else> if> ( p == 0)> >printf>(>'Hello from Child! '>);> > >// parent process because return value non-zero.> >else> >printf>(>'Hello from Parent! '>);> }> int> main()> {> >forkexample();> >return> 0;> }>

>

>

Producción

Hello from Parent! Hello from Child!>

Nota: En el código anterior, se crea un proceso hijo. fork() devuelve 0 en el proceso hijo y un entero positivo en el proceso padre. Aquí, son posibles dos salidas porque el proceso principal y el proceso secundario se ejecutan simultáneamente. Por lo tanto, no sabemos si el sistema operativo dará primero el control al proceso principal o al proceso secundario.

El proceso principal y el proceso secundario ejecutan el mismo programa, pero eso no significa que sean idénticos. El sistema operativo asigna diferentes datos y estados para estos dos procesos, y el flujo de control de estos procesos puede ser diferente. Vea el siguiente ejemplo:

Ejemplo 4: predecir el resultado del siguiente programa.

C




matriz de estructura en lenguaje c

#include> #include> #include> #include> > void> forkexample()> {> >int> x = 1;> >pid_t p = fork();> >if>(p<0){> >perror>(>'fork fail'>);> >exit>(1);> >}> >else> if> (p == 0)> >printf>(>'Child has x = %d '>, ++x);> >else> >printf>(>'Parent has x = %d '>, --x);> }> int> main()> {> >forkexample();> >return> 0;> }>

>

>

Producción

Parent has x = 0 Child has x = 2>

o

Producción

Child has x = 2 Parent has x = 0>

Aquí, el cambio de variable global en un proceso no afecta a otros dos procesos porque los datos/estado de los dos procesos son diferentes. Y también el padre y el hijo se ejecutan simultáneamente, por lo que son posibles dos salidas.

bifurcación() vs ejecutivo()

La llamada al sistema fork crea un nuevo proceso. El nuevo proceso creado por fork() es una copia del proceso actual excepto por el valor devuelto. Por otro lado, la llamada al sistema exec() reemplaza el proceso actual con un nuevo programa.

Problemas basados ​​en C fork()

1. Un proceso ejecuta el siguiente código.

C




for> (i = 0; i fork();>

>

¿Qué es el escritorio ini?
>

El número total de procesos secundarios creados es (GATE-CS-2008)

(Un
(B) 2^norte – 1
(C) 2^n
(D) 2^(n+1) – 1

Vea esto para encontrar una solución.

2. Considere el siguiente fragmento de código:

C




if> (fork() == 0) {> >a = a + 5;> >printf>(>'%d, %d '>, a, &a);> }> else> {> >a = a –5;> >printf>(>'%d, %d '>, a, &a);> }>

>

>

Sean u, v los valores impresos por el proceso padre, y x, y los valores impresos por el proceso hijo. ¿Cuál de las siguientes es VERDADERA? (GATE-CS-2005)

(A) u = x + 10 y v = y
(B) u = x + 10 y v != y
(C) u + 10 = x y v = y
(D) u + 10 = x y v != y

Vea esto para encontrar una solución.

3. Prediga el resultado del siguiente programa.

C




#include> #include> int> main()> > >fork();> >fork() && fork()>

>

>

Mira esto para la solución.

carácter a cadena en java

Artículos relacionados :

  • Programa C para demostrar fork() y pipe()
  • Procesos zombis y huérfanos en C
  • fork() y procesos de memoria compartida en blanco y negro creados con él