signalfd_siginfo结构中ssi_code的用途是什么?

时间:2011-10-07 20:08:10

标签: linux-kernel

我使用signalfd()来监视由我的进程创建的子进程的死亡。如果我使用信号杀死子进程,父进程会在信号fd上获取一个读取事件,并填充signalfd_siginfo结构。它有一个字段ssi_code,设置为子节点收到的信号编号(例如,如果我向孩子发送SIGKILL,则为9)。

我可以一直依赖这种行为吗?支持signalfd的所有Linux内核版本对此字段都有相同的用法吗?

注意:如果子进程调用exit(),则传递给exit的代码将填入ssi_code。

1 个答案:

答案 0 :(得分:3)

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页面, 信号编号。