kqueue 的 EV_RECEIPT 到底是做什么用的?

What exactly is kqueue's EV_RECEIPT for?

kqueue mechanism 有一个事件标志,EV_RECEIPT,根据链接的手册页:

... is useful for making bulk changes to a kqueue without draining any pending events. When passed as input, it forces EV_ERROR to always be returned. When a filter is successfully added the data field will be zero.

然而,我的理解是,在不耗尽任何未决事件的情况下对 kqueue 进行批量更改是微不足道的,只需将 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真的有必要吗?它在什么情况下真正有用?

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

因此可以确定是哪个 changelist 元素导致了错误。

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

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