Как исправить назначение обработчика сигнала

#c #linux #signals #handler #sigaction

#c #linux #сигналы #обработчик #sigaction

Вопрос:

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

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

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

Если я создам обработчик только с 1 параметром 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. Примечание: вы не можете использовать printf() (и друзей) из обработчика сигналов.

2. В handler определении функции отсутствует имя переменной. Вы имели в виду написать siginfo_t *si ?

Ответ №1:

Вы назначаете функцию обработчика неправильному члену 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(amp;sig.sa_mask);
    sig.sa_sigaction = handler;
  

Комментарии:

1. Я сделал это, теперь в struct sigaction нет элемента с именем «sa_action»

2. Это sa_sigaction , не sa_action .