2011-03-01 53 views
1

有人可以告訴我,爲什麼program1的信號處理程序不工作?UNIX/Linux信號

Program1: signal1.c 
#include <stdio.h> 
#include <signal.h> 

void handler(int sig) 
{ 
    printf("Caught signal: %d",sig); 
    signal(sig,handler); 
} 

int main() 
{ 
    struct sigaction sa; 
    sa.sa_handler=handler; 
    sa.sa_sigaction=NULL; 
    sigaction(SIGRTMIN,&sa,NULL); 
    kill(0,SIGRTMIN); 
} 



Actual Output: 
# ./a.out 
    Real-time signal 0 

Expected Output: 
    Caught signal: 34 

請幫我解決PROGRAM1

然而,程序2的作品,如果我使用像往常一樣簡單的信號處理程序:

enter code here 
#include <stdio.h> 
#include <signal.h> 

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

int main() 
{ 
signal(SIGRTMIN, handler); 
kill(0,SIGRTMIN); 
} 

Output: 
Caught signal: 34 

回答

3

這是因爲sa_handlersa_sigaction是成員相同的聯合:

struct sigaction { 
    union { 
     __sighandler_t _sa_handler; 
     void (*_sa_sigaction)(int, struct siginfo *, void *); 
    } _u; 
    sigset_t sa_mask; 
    unsigned long sa_flags; 
    void (*sa_restorer)(void); 
}; 

#define sa_handler _u._sa_handler 
#define sa_sigaction _u._sa_sigaction 

因此,當您設置sa_sigaction它會覆蓋sa_handler值。

+0

@Maxim:http://www.kernel.org/doc/man-pages/online/pages/man2/sigaction.2.html,這個鏈接說它不是工會? – kingsmasher1 2011-03-01 10:22:13

+0

@Maxim:雖然它在我註釋掉「sa.sa_sigaction = NULL」時起作用 – kingsmasher1 2011-03-01 10:23:14

+0

來自鏈接:***「在一些體系結構上涉及到一個聯合:不要同時分配sa_handler和sa_sigaction。」*** – 2011-03-01 10:24:14