#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
.