首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >kqueue的EV_RECEIPT到底是为了什么?

kqueue的EV_RECEIPT到底是为了什么?
EN

Stack Overflow用户
提问于 2016-06-09 16:22:44
回答 1查看 516关注 0票数 6

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

..。对于在不耗尽任何挂起事件的情况下对kqueue进行大容量更改非常有用。当作为输入传递时,它将强制始终返回EV_ERROR。成功添加筛选器时,数据字段将为零。

然而,我的理解是,只需将nevents参数的0传递给kevent,从而不从队列中提取任何事件,对kqueue进行批量更改就很简单了。考虑到这一点,为什么EV_RECEIPT是必要的?

Apple中的一些样本代码实际上使用了EV_RECEIPT:

代码语言:javascript
复制
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吗?在什么情况下它才是真正有用的呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-09 17:17:18

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

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

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

因此,EV_RECEIPT允许您将nevents设置为非零值,而无需耗尽任何挂起的事件。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37731435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档