用kqueue处理信号时获取siginfo_t
Obtain siginfo_t when handling signals with kqueue
在使用 kqueue
处理信号时,有没有办法获取 siginfo_t
结构?
(在 Linux 处理信号时 epoll
类似 struct signalfd_siginfo
是通过简单地从 signalfd
读取获得的)
很遗憾,这不可能。
通过 kqueue
的信号传递通知发生在进程本身已经对信号做出反应之后;也就是说,它们是 post 送达通知,而不是送达通知。
如果进程在对 kevent
的调用之间接收到多个信号,那么系统所做的只是汇总在 [=11= 的 data
字段中传递信号的次数]结构。
这意味着无法获取信号信息,因为在您调用 kevent
数据时,信号已经传送到进程,并且信号详细信息已被丢弃.没有内部机制记录可以由 kevent
.
传递的基础信号信息
I was reading some of the big nerd ranch book which seems to indicate that the kqueue handling for signals would not occur if there was a handler registered for the process. This does not appear to be the behaviour on Yosemite, you receive the event for signals even if there is a handler registered using either sigaction
or signal
.
在使用 kqueue
处理信号时,有没有办法获取 siginfo_t
结构?
(在 Linux 处理信号时 epoll
类似 struct signalfd_siginfo
是通过简单地从 signalfd
读取获得的)
很遗憾,这不可能。
通过 kqueue
的信号传递通知发生在进程本身已经对信号做出反应之后;也就是说,它们是 post 送达通知,而不是送达通知。
如果进程在对 kevent
的调用之间接收到多个信号,那么系统所做的只是汇总在 [=11= 的 data
字段中传递信号的次数]结构。
这意味着无法获取信号信息,因为在您调用 kevent
数据时,信号已经传送到进程,并且信号详细信息已被丢弃.没有内部机制记录可以由 kevent
.
I was reading some of the big nerd ranch book which seems to indicate that the kqueue handling for signals would not occur if there was a handler registered for the process. This does not appear to be the behaviour on Yosemite, you receive the event for signals even if there is a handler registered using either
sigaction
orsignal
.