2015-05-03 26 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