Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Pregunta sobre señales y semaforos

Estas en el tema de Pregunta sobre señales y semaforos en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 25/08/2010, 22:08
 
Fecha de Ingreso: diciembre-2007
Mensajes: 135
Antigüedad: 16 años, 10 meses
Puntos: 1
Pregunta sobre señales y semaforos

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.

Código:
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);}
¿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.

Etiquetas: señales
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:18.