Procesos secundarios esperando el uno al otro - linux, proceso, fork, waitpid

Creé tres procesos y quierosincronizar su trabajo. Específicamente, quiero que el primer proceso espere en el segundo, segundo en el tercero. Básicamente, ejecútelos en el orden inverso en el que fueron creados.

Esto es lo que hice hasta ahora.

for (; i < 3 ; i++){
pids[i] = fork();
if (pids[i] == 0)
break;
}
if (pids[i] != 0){
wait(); // Main thread has to wait..
}
else{
if (i == 0){
waitpid(pids[1], &status, 0);
printProcessInfo(0);
}
else if (i == 1){
waitpid(pids[2], &status, 0);
printProcessInfo(1);
}
else if (i == 2){
printProcessInfo(2);
}
}

Estoy usando i para verificar en qué proceso secundario estoyporque supongo que obtengo el i correcto en el proceso hijo, por lo que si i = 0, de hecho estoy en el primer hijo. ¿Es esta suposición verdadera? En cualquier caso, no recibo el pedido que quiero, de hecho los procesos se ejecutan en su orden natural, evitando las llamadas de espera que hice. ¿Alguna idea?

Respuestas

0 para la respuesta № 1

No, estás obteniendo más de 3 procesos.

Considere una versión simplificada (esto simplemente se elimina, espere ... usted hace la misma cantidad de tenedor):

for (i=0; i < 3 ; i++){
pids[i] = fork();
}

Porque haces la horquilla dentro de un ciclo for, sin verificar el valor de retorno. Ambos padres e hijos tendrán su propio hijo.

    [###############PARENT###############]
|           |           |
i=0         i=1         i=2
|           |           |
[ a0 ]      [ b0 ]      [ c0 ]
/           |
i=1 i=2       i=2
/             |
[a1]   [a2]    [ b1 ]
|
i=2
|
[a3]

Tienes que romper el ciclo después de verificar el valor de retorno para fork.


Menú