kqueue mechanism有一个事件标记EV_RECEIPT
,根据链接的手册页:
...对于对kqueue进行批量更改非常有用 没有排除任何待处理的事件。当作为输入传递时, 它会强制
EV_ERROR
始终返回。当过滤器是 成功添加数据字段将为零。
然而,我的理解是,只需将nevents
参数的0传递给kevent
,就可以对队列进行批量更改而不会耗尽任何待处理事件,从而无需从队列中抽取任何事件。考虑到这一点,为什么EV_RECEIPT
是必要的?
OS X的Apple文档中的一些sample code实际上使用了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实际上是否必要?在什么情况下它真的有用?
答案 0 :(得分:2)
如果您要进行批量更改,其中一个会导致错误,那么该事件将放在eventlist
中,flags
中设置EV_ERROR,data
中系统错误。
因此,可以识别导致错误的changelist
元素。
如果将nevents
设置为零,则会收到错误代码,但不会指示哪个事件导致错误。
因此,EV_RECEIPT允许您将nevents
设置为非零值,而不会耗尽任何待处理事件。