c switch-statement fork wait

Bifurcando SIN esperar



switch-statement fork (1)

No estoy seguro si estoy haciendo esto correctamente, estoy tratando de crear 7 procesos en total a través de ...

void err_sys(const char* x) { perror(x); exit(1); } for(i = 1; i < 7; i++){ switch(parent = fork()){ case -1: err_sys("fork error"); case 0: //child printf("I''m the child, number %d(%d)/n", i, getpid()); break; default: //parent printf("I''m the parent(%d)/n", getpid()); break; } if(parent) break; //loop break }

Cuando lo ejecuto con prog | cat> file Obtengo 6 salidas de "I am the parent", seguidas de varias cantidades de niños cada una. Sin embargo, hay 6 niños hechos con píldoras únicas. Las otras pids principales, distintas de la primera coinciden con un pid de niño. ¿Es solo un problema que viene con la producción debido a la bifurcación?


Su código no es incorrecto a priori ; hace lo que hace El problema es "¿hace lo que usted quiere que haga?", Y eso no está claro porque no ha declarado claramente lo que está tratando de hacer.

Una razón por la que obtienes 6 procesos es que tienes un bucle:

for (i = 1; i < 7; i++)

Esto cuenta 1, 2, 3, 4, 5, 6 y se detiene. Necesitas usar uno de dos idiomas:

for (i = 0; i < 7; i++) // Idiomatic C for (i = 1; i <= 7; i++) // Less idiomatic C

Suponiendo que err_sys() no devuelve cuando se llama (si lo hiciera, necesitaría un break; después de eso), entonces:

  1. El proceso se bifurca. Si la horquilla falla, el proceso sale por err_sys() .
  2. Si el proceso es el hijo (por lo que el parent variable mal nombrado se establece en 0), el código imprime "I''m the child" y luego abandona el interruptor y vuelve a iterar alrededor del ciclo.
  3. Si el proceso es el principal (por lo tanto, el parent variable mal nombrado se establece en un valor distinto de cero), imprime "Soy el padre" y luego abandona tanto el interruptor como el bucle.

Solo el niño del primer tenedor puede volver a ejecutar el ciclo. Sin embargo, cada niño, excepto el último, se identifica como el padre en la siguiente iteración del ciclo.

Buffer E / S

Tenga en cuenta que la E / S en búfer complica las cosas. Si la salida del programa se escribe en el terminal, obtendrá la salida de buffer de línea por defecto. Cada nueva línea hace que los datos se escriban en la terminal. Sin embargo, cuando la salida va a una tubería, está totalmente amortiguada; los datos solo se escriben en el terminal cuando el búfer está lleno, o el proceso se está cerrando (o cierra la salida estándar por algún otro motivo). Por lo tanto, cuando la salida va a una tubería, el primer niño tiene la salida de solo sus operaciones, pero el segundo niño tiene los datos impresos, pero no enjuagados, por el primer niño en su memoria intermedia, así como también lo que escribió. El tercer hijo tiene un rendimiento de 3 procesos, y así sucesivamente.

Puede agregar fflush(0) o fflush(stdout) después de las instrucciones de impresión (o justo después del final del switch , antes del if ) y ver qué diferencia hace. También puede ejecutar el código sin redireccionar a un conducto y ver qué diferencia hace.