valencia - el tenedor week barcelona
¿Qué es exactamente lo que devuelve el tenedor? (8)
En caso de éxito, el PID del proceso secundario se devuelve en el subproceso de ejecución principal y se devuelve un 0 en el subproceso de ejecución del secundario.
p = fork();
Estoy confundido en su página de manual, ¿ p
es igual a 0
o PID
?
Creo que funciona así: cuando pid = fork (), el código debe ejecutarse dos veces, uno está en proceso actual, uno está en proceso hijo. Así que explica por qué si / else ambos ejecutan. Y el orden es, primero el proceso actual, y luego ejecutar el hijo.
Esta es la parte genial. Es igual a AMBOS.
Bueno en realidad no. ¡Pero una vez que el fork
vuelve, ahora tiene dos copias de su programa en ejecución! Dos procesos. Puedes pensar en ellos como universos alternativos. En uno, el valor de retorno es 0
. En el otro, es la ID
del nuevo proceso!
Normalmente tendrás 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 por diferentes procesos!
Fork crea un proceso duplicado y un nuevo contexto de proceso. Cuando devuelve un valor de 0, significa que se está ejecutando un proceso secundario, pero cuando devuelve otro valor que significa que se está ejecutando un proceso principal. Por lo general, usamos la instrucción de espera para que se complete un proceso secundario y se inicie el proceso principal.
Los procesos se estructuran en un árbol dirigido en el que solo conoce a su padre único ( getppid()
). En resumen, fork()
devuelve -1
en error como muchas otras funciones del sistema, el valor distinto de cero es útil para que el iniciador de la llamada a fork (el padre) conozca su pid de nuevo hijo.
Nada es tan bueno como 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 padre, etc.) entre padre e hijo, mire clone()
(para la biblioteca C de GNU, y quizás otros)
No estoy seguro de cómo el manual puede ser más claro! fork()
crea un nuevo proceso, por lo que ahora tiene dos procesos idénticos . Para distinguirlos, el valor de retorno de fork()
difiere. En el proceso original, obtiene el PID del proceso hijo. 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
}
Una vez que se ejecuta la fork
, tienes dos procesos. La llamada devuelve valores diferentes 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ás ambos mensajes impresos. Están siendo impresos por dos procesos separados. Esta es la forma en que puede diferenciar entre los dos procesos creados.
fork()
se invoca en el proceso padre. Entonces se genera un proceso hijo. Para cuando se genera el proceso hijo, fork()
ha finalizado su ejecución.
En este punto, fork()
está listo para regresar, pero devuelve un valor diferente dependiendo de si está en el padre o hijo. En el proceso secundario, devuelve 0, y en el proceso / subproceso principal, devuelve la ID del proceso del menor.
p = fork(); /* assume no errors */ /* you now have two */ /* programs running */ -------------------- if (p > 0) { | if (p == 0) { printf("parent/n"); | printf("child/n"); ... | ...