2012-05-12 15 views
6

muszę obsłużyć jakiś sygnał z sigaction, ale kiedy mogę skompilować mój kod otrzymuję ten błąd:sygnał Uchwyt z sigaction

warning: assignment from incompatible pointer type

kod jest:

struct sigaction hup_act; 
... 
hup_act.sa_flags=SA_SIGINFO; 
hup_act.sa_sigaction = sighupHandler; 
sigaction(SIGHUP, &hup_act, NULL); 

Ostrzeżenie jest hup_act. Przypisanie sa_sigaction. To ostrzeżenie powoduje błąd segmentacji, gdy wysyłam sighup do mojej aplikacji.

+3

Proszę pokazać deklarację funkcji westchnienia. Prawdopodobnie jest to niewłaściwy typ. – SKi

+0

vigh sighupHandler (siginfo_t * info) – giozh

+1

'void sighupHandler (int, siginfo_t *, void *);' –

Odpowiedz

6

Jeśli SA_SIGINFO jest w struct sigaction jest członka sa_flags stosować metodę typu

void signalhandler(int, siginfo_t *, void *); 

jako funkcji obsługi zostać przypisany struct sigaction jest członka sa_sigaction

else użyj metody typu

void signalhandler(int); 

jako funkcji obsługi być przypisany do członka struct sigaction jest sa_handler.

5

Twój sighupHandler musi być jednym z poniżej dwóch:

void sighupHandler(int) //for sa_handler 

lub

void sighupHandler(int, signinfo_t *, void *) //for sa_sigaction which is your case 

Aby uzyskać więcej informacji na ten temat patrz here i here

EDIT: Proszę zapoznać się poniżej i mój powyżej sugerowane linki dla lepszej przejrzystości. Myślę, że w twoim przypadku z powodu wspólnego przechowywania, jak sugerowano poniżej, kompilator generuje tylko ostrzeżenie, w przeciwnym razie wygenerowałby błąd.

The sigaction structure is defined as something like:

struct sigaction { 
    void  (*sa_handler)(int); 
    void  (*sa_sigaction)(int, siginfo_t *, void *); 
    sigset_t sa_mask; 
    int  sa_flags; 
    void  (*sa_restorer)(void); 
}; 

On some architectures a union is involved: do not assign to both sa_handler and sa_sigaction .

+2

'.sa_restorer' jest przestarzały i nie jest POSIX. Lepiej nie włączać go do przykładów. – moshbear