Denunciar

Ayuda con señales

Haz una pregunta kirotodo 1Publicaciones sábado, 22 de abril de 2017Fecha de inscripción sábado, 22 de abril de 2017 Última intervención
Hola, buenas estaba programando una paso de mensajes con uso de buzones la cuestione s que 32 hijos envian mensaje al padre este comprueba por otras funciones si les concede cambio o no si les concede les envia la concesion si no los hijos se quedan esperando pero llega un momento en algunos hijos no pueden recibir cambio pork no coinciden y entonces se para el programa(esto es normal) pero luego da un error un msgrcv y en el control de errores me imprime el perror pero la señal de acabar con el programa no llega a el padre pa que los mate y libere los ipcs, si quiero acabar tengo que hacer el ctr+c por teclado para acabar con la ejecucion y que padre mate a los hijos y libere ipcs. la cuestione s pork si le envia el sigint un hijo no lo recibe pero sis e lo envio por teclado yo si???


adjunto la parte del codigo que me da el problema las mascaras estan bn puestas pork solo me ignora sigint si lo recibe con un error de msgrcv.
f(m.pids[0]==getpid()) //padre
{

for(i=0;i<32;i++)
{
if((recibo=msgrcv(m.buzon,&s,sizeof(s)-sizeof(long),1,0))==-1) //espera peticion
{
perror("Error al recibir mensaje de algun hijo\n");
kill(m.pids[0],SIGINT);
}

hijo = comprobar(padre);

if(hijo ==0)
{
insertar(padre);
}
else{
s.tipo=s.pid_;
contador++;
printf("impar-%d\n",contador);
if((envio=msgsnd(m.buzon,&s,sizeof(s)-sizeof(long),0))==-1) //concede
{
perror("Error a enviar mensaje al 1 hijo\n");
kill(m.pids[0],SIGINT);
}
//contador++;
//printf("%d\n",contador);
s.tipo=hijo;
contador++;
printf("par-%d\n",contador);
if((envio=msgrcv(m.buzon,&s,sizeof(s)-sizeof(long),0))==-1) //concede
{
perror("Error a enviar mensaje al 2 hijo\n");
kill(m.pids[0],SIGINT);
}
//contador++;
//printf("%d\n",contador);
}
}


}else //hijos
{

s.grupoAntiguo = (int)m.nombre[1];
s.tipo = 1;
s.pid_ = getpid();
s.grupoNuevo = aQuEGrupo(s.grupoAntiguo);
m.nombre[2] = (char)s.grupoNuevo;
if((envio=msgsnd(m.buzon,&s,sizeof(s)-sizeof(long),0))==-1) // envian peticion
{
perror("Error al recibir mensaje");
kill(m.pids[0],SIGINT);
}
if((recibo=msgrcv(m.buzon,&s,sizeof(s)-sizeof(long),getpid(),0))==-1) //esperan respuesta
{
kill(m.pids[0],SIGINT);
perror("Error al recibir mensaje \n");
kill(m.pids[0],SIGINT);
}else
{
printf(" Soy %d y quiero cambiarme a %d\n", getpid(),(int)m.nombre[2]);
}

//s.grupoNuevo = i;
//printf(" %c-%d\n",m.nombre[0],s.grupoAntiguo);
}
Ver más 

Los miembros obtienen más respuestas que los usuarios anónimos.

Ser miembro te permite llevar un seguimiento detallado de tus consultas.

Ser miembro te permite disfrutar de opciones adicionales.

¿Todavía no eres usuario?

¡Inscríbete, es gratis y toma menos de un minuto!