Manejo de señal en C - interrupción en interrupción
Me preguntaba si es posible ser interrumpido por una señal cuando mi programa maneja otra señal al mismo tiempo, traté de simularlo con:
<code>#include<signal.h> #include<stdlib.h> #include<stdio.h> #include<unistd.h> #include<sys/wait.h> #include<string.h> void sig_output() { sigset_t set; sigprocmask(0,NULL,&set); printf("currently blocking:"); if (sigismember(&set,SIGUSR1)) printf("\nSIGUSR1"); if(sigismember(&set,SIGUSR2)) printf("\nSIGUSR2"); printf("\n"); return ; } void sig_handler(int sig) { raise(SIGUSR1); printf("start\n"); if (sig==SIGUSR1) printf("SIGUSR1\n"); else if (sig==SIGUSR2) printf("SIGUSR2\n"); printf("end\n"); return ; } void other_sig_handler(int sig) { printf("start - other\n"); if (sig==SIGUSR1) printf("SIGUSR1\n"); else if (sig==SIGUSR2) printf("SIGUSR2\n"); printf("end - other\n"); return ; } int main() { sig_output(); struct sigaction a; a.sa_handler=sig_handler; a.sa_flags=0; sigset_t set,old; //blocking SIGUSR1,SIGUSR2 sigemptyset(&set); sigaddset(&set,SIGUSR1); sigaddset(&set,SIGUSR2); printf("blocking SIGUSR1, SIGUSR2\n"); sigprocmask(SIG_SETMASK,&set,&old); sig_output(); //adding handles for SIGUSR1,SIGUSR2 sigemptyset(&(a.sa_mask)); sigaction(SIGUSR1,&a,NULL); a.sa_handler=other_sig_handler; sigaction(SIGUSR2,&a,NULL); printf("poczatek wysylania \n"); raise(SIGUSR1); raise(SIGUSR2); raise(SIGUSR1); printf("using sigsuspend\n"); sigsuspend(&old); printf("end of program\n"); return 0; } </code>
y cada vez que ejecuto este programa me sale
<code>currently blocking: blocking SIGUSR1, SIGUSR2 currently blocking: SIGUSR1 SIGUSR2 raising using sigsuspend start - other SIGUSR2 end - other start SIGUSR1 end end of program </code>
¿Siempre es así?