Código:
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.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; }
Tampoco entiendo lo de
Código:
En otros problemas similares pones esto:while (childpid != wait (&status)) if ((childpid == 1) && (errno != EINTR));
Código:
¿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.waitreturn = wait (&status); while ( (waitreturn !=-1) || (waitreturn == -1 && errno == EINTR)) waitreturn = wait (&status);
Por ultimo no entiendo eso de if(padre==1)... para mi que sobra.
Bueno, para terminar una breve pregunta sobre semaforos.
Código:
¿tiene sentido aqui utilizar el semaforo excmut de exclusion mutua? Yo lo veo necesario si por ejemplo el semaforo libre estuviera inicializado a 10 y no a 1... y es que no veo ningun caso en el que 2 procesos puedan ejecutarse la seccion critica a la vez... otra cosa es que se produzca una interrupcion o algo en la seccion critica, pero eso no tiene nada que ver con definir un semaforo excmut...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.