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
?
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
?
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 -1
no 0
y 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.
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
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.
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