Im trabajando en una tarea que utiliza señales para transferir un mensaje binario entre dos procesos, con el objetivo de aprender sobre las señales (de hecho, es un uso extraño).¿Por qué no se llama mi manejador de señal?
En mi programa, los dos procesos se comunican un código, y luego uno transfiere un mensaje a la otra. SIGUSR1 representa 0, SIGUSR2 representa 1. La idea es que el proceso que envía el mensaje utilizará la función de cancelación con cualquier SIGUSR para transmitir el mensaje, y el proceso de recepción tendrá un controlador de señal para interpretar los códigos.
Así que aquí es el problema. Tengo el remitente encendido. duerme mientras espera que se envíe el código. El receptor envía dos SIGINT para indicar la 'contraseña', usando pidof(8)
para encontrar el pid del remitente.
Una vez manejador de la señal del remitente ha leído estas señales, reconoce que es la contraseña correcta, se procede a enviar el mensaje.
El receptor ahora ha pasado por unas pocas funciones, y está durmiendo cada segundo de espera para cada bit que se pasa a través de una interrupción. El problema es que esto nunca sucede.
he configurarlo de forma que el emisor está enviando un bit (0 en este caso), así:
kill(SIGUSR1,washingtonPID);
donde washingtonPID es el PID del receptor, y he comprobado esto es la correcta PID.
manejador del receptor está conectado de esta manera:
//IN MAIN
signal(SIGINT,bitReceiver);
signal(SIGUSR1,bitReceiver);
signal(SIGUSR2,bitReceiver);
//OUTSIDE MAIN
void bitReceiver(int signum)
{
if(signum == SIGUSR1)
{
fprintf(stderr,"SIGUSR1 - 0");
bit = 0;
}
else if (signum == SIGUSR2)
{
fprintf(stderr,"SIGUSR2 - 1");
bit = 1;
}
else //sigint
raise(SIGINT);
return;
}
donde el bit es una variable global. inicialmente se establece en -1.
Aquí es la función que lee los bits:
int receiveBit()
{
while(bit == -1)
{
sleep(1);
}
fprintf(stderr,"%d",bit);
int bit2 = bit;
bit = -1;
return bit2;
}
Así que la carrera básica por medio es la siguiente: Después de que el código ha sido enviado desde el receptor al emisor, el emisor comienza a enviar señales de finalización de USR1 y USR2 al receptor, que eventualmente debería formar un mensaje binario.
El receptor está simplemente esperando en este punto, durmiendo cada segundo. Cuando se interrumpe, el controlador establecerá el bit en 0 o 1, lo desactivará, imprimirá el bit y lo devolverá.
Si dejo los dos programas se ejecutan normalmente, el receptor sólo se sienta en el sueño, y el manejador nunca es llamado (a pesar de que puedo ver las llamadas que realiza el otro proceso.
si paro del remitente , y enviar manualmente las señales de Kill, puedo enviar una, tal vez dos señales, ambas manejadas correctamente. cualquiera después de eso, y recibo un mensaje impreso en la terminal como "señal de usuario 2". Lo cual no es algo que tenga en mi programa , y el programa se detiene inmediatamente.
Cualquier idea sobre por qué mi controlador no está siendo envidado, y por qué no puedo enviar manualmente más de una o dos señales sería muy apreciada.
Gracias por su tiempo.
EDIT: Parece que la gente se difuminan en esto. ¿Hay algún consejo para eliminar errores que pueda probar?
Todo lo que puedo decir es que este es un diseño ridículamente ineficiente, y el uso de 'pidof' de encontrar un procedimiento que no es seguro o sólida. (Imagine que alguien realiza un proceso con el mismo nombre para robar la contraseña). Debería usar conectores de dominio UNIX para este tipo de comunicación. –
Si nota en el primer párrafo, mencioné que esto es una tarea y no un problema del mundo real. Es ineficiente y el uso de pidof no es seguro. Pero no estoy preocupado por eso. – Blackbinary
¿Se declara 'bit'' volátil'? –