6

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

... 对于在不耗尽任何未决事件的情况下对 kqueue 进行批量更改很有用。当作为输入传递时,它强制EV_ERROR总是被返回。成功添加过滤器后,数据字段将为零。

然而,我的理解是,在不耗尽任何未决事件的情况下对 kqueue 进行批量更改是微不足道的,只需将nevents参数传递给 0kevent并因此从队列中不提取任何事件。考虑到这一点,为什么有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 真的有必要吗?在什么情况下它真的有用?

4

1 回答 1

4

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

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

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

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

于 2016-06-09T17:17:18.393 回答