int main(int argc, char* argv[])
{
for (i=0;i<3;i++) { //tres veces
if(padre==1){ //sólo el padre replica
childpid = fork();
if (childpid == 0){
sleep(3);
/* Hijos */
if(i==0) //primer hijo envia señal SIGUSR1
kill(getppid(), SIGUSR2) == 1);
if(i==1) //segundo hijo envia señal SIGUSR2
kill(getppid(), SIGUSR2);
if(i==2)
printf("hijo3");
padre=0; //break; //los hijos ya no entran en el bucle otra vez
}// fin hijos
else { /* Padre */
if (signal(SIGUSR1, manejador_sigusr1)== SIG_ERR ||
signal(SIGUSR2, manejador_sigusr2)== SIG_ERR){
perror("Manejador no asignado");
exit(EXIT_FAILURE);
}
printf("padre: i=%d\n",i);
while (childpid != wait (&status))
if ((childpid == 1) && (errno != EINTR));
padre=1;
return 0;
}
Las cosas que no entiendo las he señalado en negrita. ¿para que necesita hacer un sleep(3)? Lo he visto en muchos problemas y no se para que sirve, se que durme el proceso durante 3 segundos, ¿pero para que quiere dormirlo? No lo entiendo.
Tampoco entiendo lo de
Código:
while (childpid != wait (&status))
if ((childpid == 1) && (errno != EINTR));
En otros problemas similares pones esto:
Código:
waitreturn = wait (&status);
while ( (waitreturn !=-1) || (waitreturn == -1 && errno == EINTR))
waitreturn = wait (&status);
¿por que no pone solamente wait(NULL)? Que espere a todos los hijos y ya esta, no entiendo todo ese codigo. wait(&status) devuelve el codigo del hijo y ahora lo compara con ¿-1? ¿wait devuelve -1 si da error? Aun asi no entiendo la comparacion.
Por ultimo no entiendo eso de if(padre==1)... para mi que sobra.
Bueno, para terminar una breve pregunta sobre semaforos.
Código:
libre=Semaph_create("libre",1);
libre=Semaph_create("ocupado",0);
//proceso 1
while(1){
down(libre);
down(excmut);
almacenar_elemento();
up(excmut);
up(ocupado);}
//proceso 2
while(1){
down(ocupado);
down(excmut);
almacenar_elemento();
up(excmut);
up(libre);}
Bueno, ojala me podais resolver algunas dudas, muchas gracias y hasta mañana.