kqueue的EV_RECEIPT究竟是什么?

dav*_*mac 5 macos freebsd kqueue

kqueue的机制有一个事件标志,EV_RECEIPT根据链接的手册页,其中:

...对于对kqueue进行批量更改而不会耗尽任何待处理事件非常有用.当作为输入传递时,它强制EV_ERROR始终返回.成功添加过滤器后,数据字段将为零.

然而,我的理解是,在不消耗任何挂起事件的情况下对kqueue进行批量更改是很简单的,只需将nevents参数传递给0 kevent,从而不从队列中抽取任何事件.考虑到这一点,为什么需要EV_RECEIPT

OS X的Apple文档中的一些示例代码实际上使用了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);
Run Code Online (Sandbox Code Playgroud)

但是,看到changeskevent调用之后从未检查过数组,我完全不清楚为什么EV_RECEIPT在这种情况下使用它.

EV_RECEIPT真的有必要吗?它在什么情况下真的有用?

Ric*_*ith 4

如果您进行批量更改并且其中之一导致错误,则该事件将被放置在 中,并eventlist设置 EV_ERRORflags并将系统错误放在 中data

因此,可以识别哪个changelist元素导致了错误。

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

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