¿Qué devuelve exactamente el tenedor?

5 minutos de lectura

avatar de usuario
compilador

En caso de éxito, el PID del proceso secundario se devuelve en el hilo de ejecución del padre y se devuelve un 0 en el hilo de ejecución del hijo.

p = fork();

Estoy confundido en su página de manual, es p igual a 0 o PID?

  • alguien puede incluir getpid() ¿en la imagen? getpid() en niño devuelve 0?

    – Shrinidhi

    7 de abril de 2011 a las 8:47


  • @Shrinidhi: También fork().

    – BoltClock

    7 de abril de 2011 a las 8:50

  • Es tanto pid como 0. Cuando se llama a fork, el programa se “divide” en dos: él mismo y su gemelo malvado. En el programa original, es 0. En el programa gemelo malvado, es el pid.

    – Esteban Chung

    7 de abril de 2011 a las 9:38

  • creería que un fork devuelve una pequeña porción de comida, pero podría estar equivocado. 😉

    – Thomas Matthews

    07/04/2011 a las 20:00

  • ¿Qué hay que confundir? La documentación que citó es bastante clara.

    – usuario207421

    2 de noviembre de 2016 a las 1:29

avatar de usuario
Oliver Charlesworth

¡No estoy seguro de cómo el manual puede ser más claro! fork() crea un nuevo proceso, por lo que ahora tiene dos idéntico procesos. Para distinguir entre ellos, el valor de retorno de fork() difiere En el proceso original, obtiene el PID del proceso secundario. En el proceso hijo, obtienes 0.

Así que un uso canónico es el siguiente:

p = fork();
if (0 == p)
{
    // We're the child process
}
else if (p > 0)
{
    // We're the parent process
}
else
{
    // We're the parent process, but child couldn't be created
}

  • 0 también significa que no se crea ningún proceso, ¿verdad? De lo contrario, los procesos se crearán de forma recursiva, nunca se detendrán…

    – compilador

    7 de abril de 2011 a las 8:38

  • @compiler: no, ambos procesos (el anterior y el recién creado) continúan ejecutándose después la llamada a fork.

    – Joaquín Sauer

    7 de abril de 2011 a las 9:04

  • @Joachim Sauer, quiero decir que ningún proceso es creado,no estoy diciendo Salida

    – compilador

    7 de abril de 2011 a las 9:54

  • @compiler: no hay recursividad. Como dice @Joachim, el nuevo proceso no comienza desde el principio de main, continúa directamente después del fork() llamada.

    –Oliver Charlesworth

    7 de abril de 2011 a las 9:56

  • Si no se crea ningún proceso, eso significa fork ha falladopor lo que vuelve -1no 0y conjuntos errno adecuadamente. Hace esto en el proceso original (que no es padre, porque no se creó ningún proceso).

    – zwol

    6 de junio de 2011 a las 2:37


                             p = fork();
                        /* assume no errors */
                        /* you now have two */
                        /* programs running */
                         --------------------
      if (p > 0) {                |            if (p == 0) {
        printf("parent\n");       |              printf("child\n");
        ...                       |              ...

Los procesos se estructuran en un árbol dirigido donde solo conoces a tu padre soltero (getppid()). En breve, fork() devoluciones -1 en caso de error, como muchas otras funciones del sistema, el valor distinto de cero es útil para que el iniciador de la llamada de bifurcación (el padre) conozca su pid de nuevo hijo.

Nada es tan bueno como el ejemplo:

/* fork/getpid test */
#include <sys/types.h>
#include <unistd.h>     /* fork(), getpid() */
#include <stdio.h>

int main(int argc, char* argv[])
{
    int pid;

    printf("Entry point: my pid is %d, parent pid is %d\n",
           getpid(), getppid());

    pid = fork();
    if (pid == 0) {
        printf("Child: my pid is %d, parent pid is %d\n",
               getpid(), getppid());
    }
    else if (pid > 0) {
        printf("Parent: my pid is %d, parent pid is %d, my child pid is %d\n",
               getpid(), getppid(), pid);
    }
    else {
        printf("Parent: oops! can not create a child (my pid is %d)\n",
               getpid());
    }

    return 0;
}

Y el resultado (bash es pid 2249, en este caso):

Entry point: my pid is 16051, parent pid is 2249
Parent: my pid is 16051, parent pid is 2249, my child pid is 16052
Child: my pid is 16052, parent pid is 16051

Si necesita compartir algunos recursos (archivos, pid principal, etc.) entre padre e hijo, consulte clone() (para la biblioteca GNU C, y quizás otros)

Una vez fork se ejecuta, tienes dos procesos. La llamada devuelve diferentes valores a cada proceso.

Si haces algo como esto

int f;
f = fork();
if (f == 0) {
  printf("I am the child\n");
} else {
  printf("I am the parent and the childs pid is %d\n",f);

}

Verá ambos mensajes impresos. Están siendo impresos por dos procesos separados. Esta es la forma en que puede diferenciar entre los dos procesos creados.

avatar de usuario
Chris Cooper

Esta es la parte genial. Es igual a AMBOS.

Bueno en realidad no. Pero una vez fork devoluciones, ¡ahora tiene dos copias de su programa ejecutándose! Dos procesos. Puedes pensar en ellos como universos alternativos. En uno, el valor de retorno es 0. En el otro, es el ID del nuevo proceso!

Por lo general, tendrá algo como esto:

p = fork();
if (p == 0){
    printf("I am a child process!\n");
    //Do child things
}
else {
    printf("I am the parent process! Child is number %d\n", p);
    //Do parenty things
}

En este caso, ambas cadenas se imprimirán, ¡pero mediante procesos diferentes!

  • Tienes el padre/hijo al revés.

    – interjay

    7 de abril de 2011 a las 7:56

  • @interjay: ¡Ups! Gracias. Reparado.

    – Chris Cooper

    7 de abril de 2011 a las 7:58

fork() se invoca en el proceso padre. Luego se genera un proceso hijo. En el momento en que se genera el proceso hijo, fork() ha terminado su ejecución.

En este punto, fork() está listo para regresar, pero devuelve un valor diferente dependiendo de si está en el padre o en el hijo. En el proceso secundario, devuelve 0, y en el proceso/subproceso principal, devuelve el ID del proceso secundario.

  • Tienes el padre/hijo al revés.

    – interjay

    7 de abril de 2011 a las 7:56

  • @interjay: ¡Ups! Gracias. Reparado.

    – Chris Cooper

    7 de abril de 2011 a las 7:58

avatar de usuario
carloabelli

Fork crea un proceso duplicado y un nuevo contexto de proceso. Cuando devuelve un valor 0, significa que se está ejecutando un proceso secundario, pero cuando devuelve otro valor, significa que se está ejecutando un proceso principal. Por lo general, usamos una declaración de espera para que un proceso secundario se complete y el proceso principal comience a ejecutarse.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad