Hola, tengo dudas sobre unos problemas, a ver si me las pueden aclarar. En este problema el proceso padre crea 3 hijos. Los 2 primeros hijos envian las señales sigusr1 y sigusr2 al padre respectivamente.
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
En otros problemas similares pones esto:
¿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.
¿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 sección critica a la vez... otra cosa es que se produzca una interrupcion o algo en la sección critica, pero eso no tiene nada que ver con definir un semaforo excmut...
Bueno, ojala me podais resolver algunas dudas, muchas gracias y hasta mañana.
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 [Seleccionar]
while (childpid != wait (&status))
if ((childpid == 1) && (errno != EINTR));
En otros problemas similares pones esto:
Código [Seleccionar]
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 [Seleccionar]
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);}
¿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 sección critica a la vez... otra cosa es que se produzca una interrupcion o algo en la sección critica, pero eso no tiene nada que ver con definir un semaforo excmut...
Bueno, ojala me podais resolver algunas dudas, muchas gracias y hasta mañana.