我使用signalfd()来监视由我的进程创建的子进程的死亡。如果我使用信号杀死子进程,父进程会在信号fd上获取一个读取事件,并填充signalfd_siginfo结构。它有一个字段ssi_code,设置为子节点收到的信号编号(例如,如果我向孩子发送SIGKILL,则为9)。
我可以一直依赖这种行为吗?支持signalfd的所有Linux内核版本对此字段都有相同的用法吗?
注意:如果子进程调用exit(),则传递给exit的代码将填入ssi_code。
答案 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页面, 信号编号。