2015-05-03 25 views
0

我的代码C Unix有问题。我将复制关键部分: 因此,在第一个sigprocmask发送SIG_UNBLOCK后,不发送前一个句柄(gestisciSignalDopoReg),而是使用标准句柄管理我的信号,因此它只是终止该过程...什么是错误?谢谢sigprocmask不恢复我的信号处理程序

struct sigaction gestoreSegnale; 
sigset_t mask; 
sigemptyset(&mask); 
sigaddset(&mask,SIGTERM); 
sigaddset(&mask,SIGINT); 
sigaddset(&mask,SIGALRM); 
sigaddset(&mask,SIGQUIT); 
sigaddset(&mask,SIGHUP); 
sigaddset(&mask,SIGSEGV); 
sigaddset(&mask,SIGILL); 
sigaddset(&mask,SIGPIPE); 
void setSegnali(int segn,__sighandler_t handler){ 
    gestoreSegnale.sa_handler=handler; 
    gestoreSegnale.sa_mask=mask; 

    sigaction(segn, &gestoreSegnale, NULL); 
} 
void eseguiSetSegnali(__sighandler_t handler){ 
    setSegnali(SIGQUIT, handler); 
    setSegnali(SIGSEGV, handler); 
    setSegnali(SIGILL, handler); 
    setSegnali(SIGHUP, handler); 
    setSegnali(SIGTERM, handler); 
    setSegnali(SIGINT, handler); 
} 
void main(){ 
eseguiSetSegnali(gestisciSIGNALDopoReg); 
sigprocmask(SIG_BLOCK,&mask,NULL); 
.........other part of code......... 
sigprocmask(SIG_UNBLOCK,&mask,NULL); 
} 

请!我需要帮助!

回答

2

您不会初始化struct sigactionsa_flags字段,因此它可能包含垃圾值。这是可能的SA_RESETHAND位设定,而根据该男子页会给你这种行为:

 SA_RESETHAND 
       Restore the signal action to the default state once the signal handler has been called. This flag is 
       only meaningful when establishing a signal handler. SA_ONESHOT is an obsolete, non-standard synonym 
       for this flag. 

如果你的信号处理程序已经运行一次,这会导致它被清除,返回为默认,所以你可能只需要零出像国旗:

void setSegnali(int segn,__sighandler_t handler){ 
    gestoreSegnale.sa_handler=handler; 
    gestoreSegnale.sa_mask=mask; 
    /* Make sure to clear flags */ 
    gestoreSegnale.sa_flags=0; 

    sigaction(segn, &gestoreSegnale, NULL); 
} 

无论如何,下面的小例子工程:

#include <signal.h> 
#include <stdio.h> 

void handler(int sig) { 
    printf("HUP %d\n", sig); 
} 

void main(){ 
    struct sigaction act; 

    /* Block SIGHUP while the signal handler is running */ 
    sigemptyset(&act.sa_mask); 
    sigaddset(&act.sa_mask,SIGHUP); 

    /* Define handler for signal */ 
    act.sa_handler = handler; 

    /* Clear flags */ 
    act.sa_flags = 0; 
    act.sa_restorer = NULL; 

    /* Install handler for SIGHUP */ 
    sigaction(SIGHUP, &act, NULL); 

    /* Set mask to block SIGHUP */ 
    sigset_t mask; 
    sigemptyset(&mask); 
    sigaddset(&mask, SIGHUP); 

    /* Block SIGHUP */ 
    printf("Blocking SIGHUP\n"); 
    sigprocmask(SIG_BLOCK,&mask,NULL); 
    printf("Sleeping\n"); 
    sleep(60); 
    /* Unblock SIGHUP */ 
    printf("Unblocking SIGHUP\n"); 
    sigprocmask(SIG_UNBLOCK,&mask,NULL); 
    printf("Sleeping again\n"); 
    while(1) 
     sleep(60); 
} 

如果跑,你看到期望的结果:

$ ./sigtest 
Blocking SIGHUP 
Sleeping    <-- SIGHUP sent from another terminal here but blocked 
Unblocking SIGHUP 
HUP 1    <-- Signal sent earlier now delivered and handled 
Sleeping again 
HUP 1    <-- Further signals sent are all handled 
HUP 1 
HUP 1 
^C