kqueue机制中有一个事件标志,
苹果OS X文档中的示例代码实际上使用了EV_RECEIPT。
EV_RECEIPT
,根据链接的man页面所述:
然而,我的理解是通过将...对于在不排空任何挂起事件的情况下批量更改kqueue非常有用。作为输入传递时,它强制始终返回
EV_ERROR
。当成功添加过滤器时,数据字段将为零。
nevents
参数设置为0并从队列中不抽取任何事件,可以轻松地对kqueue进行批量更改而不排空任何挂起事件。那么,为什么需要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是否真的必要?在什么情况下它才会真正有用?
kevent
,使用了EV_RECEIPT
,并且既没有检查kevent
的返回值,也没有检查返回事件中的值。你知道“我们得到我们期望的内容”这句话的含义吗?还是在这种情况下使用EV_RECEIPT
是虚假的? - davmacnevents
设置为零可以实现相同的行为,因为没有检查返回值。但是,在其他代码中可能会复制此模式,其中检查返回值。期望返回新过滤器而不是挂起事件。 - Richard Smith