2011-03-01 72 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