2011-03-01 4 views
1

Quelqu'un peut-il me dire pourquoi le gestionnaire de signal de programme1 ne fonctionne pas?Signaux 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 

S'il vous plaît aidez-moi à résoudre Program1

Cependant, le program2 fonctionne, si j'utiliser un simple gestionnaire de signaux comme comme d'habitude:

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 

Répondre

3

En effet, sa_handler et sa_sigaction sont membres de la même union:

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 

Ainsi que lorsque vous définissez sa_sigaction il écrase la valeur sa_handler.

+0

@Maxim: http://www.kernel.org/doc/man-pages/online/pages/man2/sigaction.2.html, ce lien dit que ce n'est pas un syndicat? – kingsmasher1

+0

@Maxim: Bien que cela fonctionne quand je commente "sa.sa_sigaction = NULL" – kingsmasher1

+0

Du lien: *** "Sur certaines architectures une union est impliquée: ne pas assigner à sa_handler et sa_sigaction." *** –