kqueue的EV_RECEIPT究竟是什么?

时间:2016-06-09 16:22:44

标签: macos freebsd kqueue

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实际上是否必要?在什么情况下它真的有用?

1 个答案:

答案 0 :(得分:2)

如果您要进行批量更改,其中一个会导致错误,那么该事件将放在eventlist中,flags中设置EV_ERROR,data中系统错误。

因此,可以识别导致错误的changelist元素。

如果将nevents设置为零,则会收到错误代码,但不会指示哪个事件导致错误。

因此,EV_RECEIPT允许您将nevents设置为非零值,而不会耗尽任何待处理事件。