kqueue 机制有一个事件标志,根据EV_RECEIPT
链接的手册页:
... 对于在不耗尽任何未决事件的情况下对 kqueue 进行批量更改很有用。当作为输入传递时,它强制
EV_ERROR
总是被返回。成功添加过滤器后,数据字段将为零。
然而,我的理解是,在不耗尽任何未决事件的情况下对 kqueue 进行批量更改是微不足道的,只需将nevents
参数传递给 0kevent
并因此从队列中不提取任何事件。考虑到这一点,为什么有EV_RECEIPT
必要?
苹果 OS X 文档中的一些示例代码实际上使用了 EV_RECEIPT:
kq = kqueue();
EV_SET(&changes, gTargetPID, EVFILT_PROC, EV_ADD | EV_RECEIPT, NOTE_EXIT, 0, NULL);
(void) kevent(kq, &changes, 1, &changes, 1, NULL);
但是,由于changes
在调用后从未检查过数组kevent
,我完全不清楚为什么EV_RECEIPT
在这种情况下使用。
EV_RECEIPT 真的有必要吗?在什么情况下它真的有用?