Как исправить назначение обработчика сигнала - PullRequest
0 голосов
/ 07 марта 2019

Для программирования на Linux C у меня есть этот обработчик и основной метод:

void handler(int number, signinfo_t, void *ignore){
    printf("Signaling %d\n", si->si_pid);
}

int main(){
    struct sigaction sig;
    sig.sa_flags = SA_SIGINFO;
    sigemptyset(&sig.sa_mask);
    sig.sa_handler = handler // This line has error 

Если я создаю обработчик только с одним параметром void handler(int num), он работает нормально;однако я не смогу использовать si->si_pid.Я получаю предупреждение:

 warning: assignment to __sighandler_t from an incompatible pointer type
 -Wincompatible-pointer-types
 sig.sa_handler = handler;

Вместо этого я делаю sig.sa_action?Я хочу исправить предупреждение

1 Ответ

1 голос
/ 07 марта 2019

Вы назначаете функцию обработчика не тому члену sig. Декларация struct sigaction:

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

sig.sa_handler - это функция с одним аргументом, номером сигнала. Когда вы используете флаг SA_SIGINFO, вам нужно назначить функцию с тремя аргументами вместо sig.sa_sigaction.

int main(){
    struct sigaction sig;
    sig.sa_flags = SA_SIGINFO;
    sigemptyset(&sig.sa_mask);
    sig.sa_sigaction = handler;
...