Какая польза от ssi_code в структуре signalfd_siginfo? - PullRequest
2 голосов
/ 08 октября 2011

Я использую signalfd () для отслеживания смерти дочерних процессов, созданных моим процессом. Если я убиваю дочерний процесс с помощью сигнала, родитель получает событие чтения по сигналу fd с заполненной структурой signalfd_siginfo. В нем есть поле ssi_code, в котором указан номер сигнала, который получил ребенок (например, 9, если я отправил SIGKILL ребенку).

Могу ли я всегда полагаться на это поведение? Все версии ядра Linux, где поддерживается signalfd, одинаково используются в этом поле?

Примечание. Если дочерний элемент вызывает метод exit (), то код, переданный для выхода, заполняется в ssi_code.

1 Ответ

3 голосов
/ 16 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...