Ayuda con fork y devolución asíncrona de valores

B

Hola:
Estoy envuelto en el desarrollo de una practica de gestion y comunicación de procesos, llevo unas cuantas horas dale que te pego a una cuestión y no soy capaz de sacar una conclusión funcional.

Resumiendo el planteamiento: 1 Proceso padre crea 3 hijos que tienen tiempos de ejecucion diversos, estos devuelven un numero entre 0 y 3 al proceso padre, pero claro,no lo hacen de forma ordenada... La primera hace mas o menos bien lo que pretendo (el switch con sus cases para la especificación del codigo de los hijos), el problema esta a partir de la salida del primer bucle for a partir del comentario /Proceso DON/. De entrada cuando ejecuto el programa la frase: "Voy a esperar noticias de mis capos" del proceso padre aparece cuando los hijos ya han devuelto algun que otro valor y entiendo en consecuencia que la recogida de valores de la siguiente manera:

               
for (i=1; i<=MAXCAPOS; i++){ int retorno; waitpid(pidCapo[i], &retorno, 0); retorno=WEXITSTATUS(retorno); printf("\nDON: Al capo %d no le han pagado %d comercios", i, retorno); totalImpagos += retorno; }

No da buenos resultados. La duda es si podriais decirme alguna forma de recoger esos datos de forma asincrona. Gracias
Sin mas dilación, el codigo que tengo de momento:

codigo
MTX_Anubis

Hace muchos años que no toco C pero pidCapo lo estás modificando en hijos y leyendo en el padre, que cada hijo tendrá una copia de ese array y no modificará la del padre. Aunque lo que tuviera es una copia a la referencia te funcionaría mal igualmente puesto que la ejecución siguiente del padre podría ir antes que la de los hijos.

fork devuelve el pid del hijo en el caso de ser el padre y 0 en el caso de estar en la ejecución del hijo. Lo que tienes que hacer es si es distinto de 0, guardarlo en el array y seguir hasta que hayas creado todos los hijos. Es decir, hacer el switch algo parecido a esto

forkPid = fork()
switch(forkPid) {
case -1: ...
case 0: // trabajo del hijo
default: 
  pidCapo[i]=forkPid;
  if (i==MAXCAPOS) 
    // Aqui haces lo que tengas que hacer porque ya has terminado de crear todos tus hijos
...
}

Es por la mañana y estoy algo espeso aun pero creo que debería ser algo así xD

Edit: Mira aquí ponen un modo más sencillo

http://stackoverflow.com/questions/19461744/make-parent-wait-for-all-child-processes

1 respuesta
B

#2 Gracias, probaré a ver si me aclaro con eso :)

Usuarios habituales