У вашего .sa_flags
бит SA_SIGINFO
сброшен.
Цитирование http://pubs.opengroup.org/onlinepubs/7908799/xsh/sigaction.html,
SA_SIGINFO
Если сбросить и уловить сигнал, функция перехвата сигнала будет введена как:
void func(int signo);
где signo
- единственный аргумент функции перехвата сигнала. В этом случае элемент sa_handler
должен использоваться для описания функции перехвата сигнала, а приложение не должно изменять элемент sa_sigaction
.
Если установлено SA_SIGINFO
и сигнал пойман, функция захвата сигнала будет введена как:
void func(int signo, siginfo_t *info, void *context);
где два дополнительных аргумента передаются в функцию перехвата сигнала. Второй аргумент будет указывать на объект типа siginfo_t
, объясняющий причину, по которой был сгенерирован сигнал; третий аргумент может быть приведен к указателю на объект типа ucontext_t
для ссылки на контекст принимающего процесса, который был прерван при доставке сигнала. В этом случае для описания функции перехвата сигнала необходимо использовать элемент sa_sigaction
, а приложение не должно изменять элемент sa_handler
.
Элемент si_signo
содержит сгенерированный системой номер сигнала.
Элемент si_errno
может содержать зависящую от реализации дополнительную информацию об ошибке; если не ноль, он содержит номер ошибки, идентифицирующий условие, которое вызвало генерирование сигнала.
Элемент si_code
содержит код, определяющий причину сигнала. Если значение si_code
меньше или равно 0, то сигнал был сгенерирован процессом, а si_pid
и si_uid
соответственно указывают идентификатор процесса и реальный идентификатор пользователя отправителя. Описание заголовка <signal.h>
содержит информацию о содержании сигнала для элементов типа siginfo_t
.
- Конечная цитата
Таким образом, sigaction использует .sa_handler
, если бит очищен, и .sa_sigaction
, если бит установлен.
То есть у вас неопределенное поведение, поскольку вы читаете неписанные аргументы.
Установите .sa_flags = SA_SIGINFO | ...
для устранения проблемы.