• Sábado 14 de Diciembre de 2024, 17:46

Autor Tema:  Pregunta sobre señales y semaforos  (Leído 821 veces)

y0mism000

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Pregunta sobre señales y semaforos
« en: Sábado 28 de Agosto de 2010, 05:41 »
0
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=%dn",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:

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);}

¿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...

Bueno, ojala me podais resolver algunas dudas, muchas gracias y hasta mañana.