he escrito un pequeño fragmento de código. Este código primero bloquea el {SIGSEGV}, luego agrega SIGRTMIN al mismo conjunto. Entonces, mi conjunto de señal final es {SIGSEGV, SIGRTMIN}. Por lo tanto, si uso SIG_UNBLOCK, según mi entendimiento, primero debe desbloquearse SIGRTMIN, y nuevamente si invoco SIG_UNBLOCK, SIGSEGV debe ser desbloqueado.sigprocmask() señales de bloqueo en UNIX
Es decir, 1) {SIGSEGV, SIGRTMIN} 2) SIG_UNBLOCK = desbloquear SIGRTMIN, 3) Invocar nuevamente SIG_UNBLOCK = desbloquear SIGSEGV. Le estoy dando al proceso un SIGRTMIN solamente, por lo tanto, mi segundo desbloqueo debe detener el proceso con SIGRTMIN. Pero no lo es. Por favor ayuda. N.B: No proporcione enlaces a las respuestas de otras preguntas en sigprocmask(), los he visto y no aclaran mi pregunta.
enter code here
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
sigset_t old_set,new_set;
sigemptyset(&old_set);
sigemptyset(&new_set);
if(sigaddset(&old_set,SIGSEGV)==0)
{
printf("sigaddset successfully added for SIGSEGV\n");
}
sigprocmask(SIG_BLOCK,&old_set,NULL); // SIGSEGV signal is masked
kill(0,SIGSEGV);
//*****************************************************************
if(sigaddset(&new_set,SIGRTMIN)==0)
{
printf("sigaddset successfully added for SIGRTMIN\n");
}
sigprocmask(SIG_BLOCK,&new_set,&old_set); // SIGRTMIN signal is masked
kill(0,SIGSEGV);
//****************** Unblock one signal at a time ******************
sigprocmask(SIG_UNBLOCK,&new_set,&old_set); // SIGRTMIN signal is unmasked
sigprocmask(SIG_UNBLOCK,&new_set,&old_set); // SIGSEGV signal is unmasked
}
Output:
[[email protected] signals]# ./a.out
sigaddset successfully added for SIGSEGV
sigaddset successfully added for SIGRTMIN
(Note:SIGSEGV is not received even after sigprocmask(SIG_UNBLOCK,&new_set,&old_set); a second time)
@kubi: ¿Por qué no estoy recibiendo SIGSEGV? – kingsmasher1
@kubi: No, no creo que todo el conjunto se desbloquea de una vez. Verifique el enlace: http://stackoverflow.com/questions/25261/help-with-sigprocmask. Además, sigprocmask() no bloquea ni desbloquea, es el argumento o el primer parámetro lo que hace que bloquee, desbloquee o enmascare. Entonces, por favor piensa antes de señalarme mal. – kingsmasher1
@ kingsmasher1: ¿Cómo maneja 'SIGSEGV'? ¿Podría pegar un fragmento del código del controlador de señal? ¿La señal se envía correctamente? Verifique los códigos de error de 'sigprocmask' y' kill'. – kubi