tenedor() en C

La llamada al sistema de bifurcación se usa para crear un nuevo proceso, que se llama proceso secundario , que se ejecuta simultáneamente con el proceso que realiza la llamada a la bifurcación() (proceso principal). Después de que se crea un nuevo proceso secundario, ambos procesos ejecutarán la siguiente instrucción después de la llamada al sistema fork(). Un proceso hijo usa la misma computadora (contador de programa), los mismos registros de CPU, los mismos archivos abiertos que usa 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 secundario no tuvo éxito.
Cero : volvió al proceso secundario recién creado.
Valor positivo : devuelto al padre o al autor de la llamada. El valor contiene el ID de proceso del proceso secundario recién creado.

creating a fork process

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 el entorno de Windows.

  1. Prediga la salida del siguiente programa: .

    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>
    int main()
    {
      
        // make two process which run same
        // program after this instruction
        fork();
      
        printf("Hello world!\n");
        return 0;
    }

    Producción:

    Hello world!
    Hello world!
    
  2. Calcular el número de veces que se imprime hello:

    #include <stdio.h>
    #include <sys/types.h>
    int main()
    {
        fork();
        fork();
        fork();
        printf("hello\n");
        return 0;
    }

    Producción:

    hello
    hello
    hello
    hello
    hello
    hello
    hello
    hello
    

    El número de veces que se imprime ‘hola’ es igual al número de procesos creados. Número total de procesos = 2 n , donde n es el número de llamadas al sistema de bifurcación. Así que aquí n = 3, 2 3 = 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
    
    

    Así que hay un total de ocho procesos (nuevos procesos secundarios 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 la 1.ª bifurcación: P1
    Procesos creados por la 2.ª bifurcación: P2, P3
    Procesos creados por la 3.ª bifurcación: P4, P5, P6, P7

                 P0
             /   |   \
           P1    P4   P2
          /  \          \
        P3    P6         P5
       /
     P7
    
  3. Prediga la salida del siguiente programa:

    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>
    void forkexample()
    {
        // child process because return value zero
        if (fork() == 0)
            printf("Hello from Child!\n");
      
        // parent process because return value non-zero.
        else
            printf("Hello from Parent!\n");
    }
    int main()
    {
        forkexample();
        return 0;
    }

    Producción:

    1.
    Hello from Child!
    Hello from Parent!
         (or)
    2.
    Hello from Parent!
    Hello from Child!
    

    En el código anterior, se crea un proceso secundario. fork() devuelve 0 en el proceso secundario y un entero positivo en el proceso principal.
    Aquí, dos salidas son posibles 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.

    Importante: 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:

  4. Prediga la salida del siguiente programa:

    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>
      
    void forkexample()
    {
        int x = 1;
      
        if (fork() == 0)
            printf("Child has x = %d\n", ++x);
        else
            printf("Parent has x = %d\n", --x);
    }
    int main()
    {
        forkexample();
        return 0;
    }

    Producción:

    Parent has x = 0
    Child has x = 2
         (or)
    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 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() frente a exec()

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. La llamada al sistema exec() reemplaza el proceso actual con un nuevo programa.

Ejercicio:

  1. Un proceso ejecuta el siguiente código:

    for (i = 0; i < n; i++)
        fork();

    El número total de procesos secundarios creados es: (GATE-CS-2008)
    (A) n
    (B) 2^n – 1
    (C) 2^n
    (D) 2^(n+1) – 1;

    Ver esto para la solución.

  2. Considere el siguiente fragmento de código:

    if (fork() == 0) {
        a = a + 5;
        printf("%d, %d\n", a, &a);
    }
    else {
        a = a –5;
        printf("%d, %d\n", 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
    Ver esto para la solución.

  3. Prediga la salida del programa a continuación.

    #include <stdio.h>
    #include <unistd.h>
    int main()
    {
        fork();
        fork() && fork() || fork();
        fork();
      
        printf("forked\n");
        return 0;
    }

    Ver esto para la solución

Artículos relacionados:
Programa en C para demostrar los procesos fork() y pipe()
Zombie y Huérfano en C
fork() y los procesos en blanco y negro compartidos en memoria creados con él.

Referencias:
http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/create.html

Este artículo es una contribución de Team GeeksforGeeks y Kadam Patel . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *