Pregunta

Generalmente cuando necesito bifurcar en C, hago algo como esto:

pid_t p = fork();
if(p == 0) { /* do child stuff */ }
else { /* do parent stuff and pray there wasn't an error */ }

Se me ocurrió que podía deshacerme de la variable adicional y usar:

if(fork() == 0) { /* child */ }
else { /* parent/pray */ }

Dejando de lado el manejo incorrecto de errores, (¿por qué) funciona / no funciona?

¿Fue útil?

Solución

Lo que estás sugiriendo ciertamente funcionará. Sin embargo, el manejo de errores no es opcional en ninguna aplicación de buen comportamiento. El siguiente patrón de implementación es igualmente sucinto y también maneja errores. Además, guarda el valor de retorno de fork () en la variable pid, en caso de que quiera usarlo más adelante en el padre para, por ejemplo, esperar al hijo.

switch (pid = fork()) {
case -1:       /* Failure */
  /* ... */
case 0:        /* Child */
  /* ... */
default:       /* Parent */
  /* ... */
}

Otros consejos

Se pierde la ID del proceso hijo en el padre, que es lo que se devuelve al padre. Creo que podría recuperar esa información, pero quizás no de forma única (es decir, creo que podría obtener el PID de todos sus hijos, pero no necesariamente el PID del niño que acaba de bifurcar). Si no necesita conocer el PID del niño, creo que la segunda forma es correcta.

Además, se devuelve -1 si hay un error en la bifurcación, que no está probando en ninguno de los dos casos, lo que suele ser un error.

Debes hacer esto en su lugar. Nunca he sabido que no funcione. Así se hace en los libros de Stevens.

int p;
if((p = fork()) == 0) { /* child */ }
else { /* parent/pray */ }

Usted es libre de hacer eso en C y funcionará porque el padre y el hijo recibirán diferentes valores de retorno de la bifurcación, y esto se evalúa primero. Los únicos problemas son el manejo de errores como mencionaste. Además, no tendrá otra forma de recuperar el PID secundario en caso de que quiera operarlo, como con un waitpid, etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top