Для чего используется ssi_code в структуре signalfd_siginfo?

#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 для получения более подробной информации об этом коде, который не является номером сигнала.