#linux-kernel
#linux-ядро
Вопрос:
Я использую signalfd() для отслеживания смерти дочерних процессов, созданных моим процессом. Если я завершаю дочерний процесс с помощью сигнала, родительский получает событие чтения в signalfd с заполненной структурой signalfd_siginfo. В нем есть поле ssi_code, для которого задан номер сигнала, полученный дочерним элементом (например, 9, если я отправил SIGKILL дочернему элементу).
Могу ли я всегда полагаться на это поведение? Все версии ядра Linux, в которых поддерживается signalfd, одинаково используют это поле?
Примечание: если дочерний элемент вызывает exit(), то код, переданный для выхода, заполняется в ssi_code .
Ответ №1:
справочная страница состояний signalfd :
The format of the signalfd_siginfo structure(s) returned by read(2)s from a signalfd file descriptor is as follows:
struct signalfd_siginfo {
uint32_t ssi_signo; /* Signal number */
int32_t ssi_errno; /* Error number (unused) */
int32_t ssi_code; /* Signal code */
uint32_t ssi_pid; /* PID of sender */
uint32_t ssi_uid; /* Real UID of sender */
int32_t ssi_fd; /* File descriptor (SIGIO) */
uint32_t ssi_tid; /* Kernel timer ID (POSIX timers)
uint32_t ssi_band; /* Band event (SIGIO) */
uint32_t ssi_overrun; /* POSIX timer overrun count */
uint32_t ssi_trapno; /* Trap number that caused signal */
int32_t ssi_status; /* Exit status or signal (SIGCHLD) */
int32_t ssi_int; /* Integer sent by sigqueue(2) */
uint64_t ssi_ptr; /* Pointer sent by sigqueue(2) */
uint64_t ssi_utime; /* User CPU time consumed (SIGCHLD) */
uint64_t ssi_stime; /* System CPU time consumed (SIGCHLD) */
uint64_t ssi_addr; /* Address that generated signal
(for hardware-generated signals) */
uint8_t pad[X]; /* Pad size to 128 bytes (allow for
additional fields in the future) */
};
Кажется ясным: ssi_signo содержит номер сигнала. О ssi_code говорится, что :
Не все поля в возвращаемой структуре signalfd_siginfo будут действительными для определенного сигнала; набор допустимых полей можно определить по значению, возвращаемому в поле ssi_code. Это поле является аналогом поля siginfo_t si_code; подробности см. в sigaction(2).
См. Справочную страницу sigaction для получения более подробной информации об этом коде, который не является номером сигнала.