2016-06-09 27 views
5

kqueue mechanism有一个事件标志,EV_RECEIPT,它根据链接的手册页:kqueue的EV_RECEIPT究竟是什么?

...是使批量更改到kqueue的 不会消耗任何未决的事件非常有用。当作为输入通过时, 强制EV_ERROR始终返回。当一个过滤器是 成功添加的数据字段将为零。然而

我的理解是,它是微不足道的建立到kqueue的大量修改而不消耗任何未决事件,简单地通过使0为nevents参数kevent,因此绘图没有从队列中的事件。考虑到这一点,为什么EV_RECEIPT需要?苹果文档OS X在

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

回答

2

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

因此,有可能确定哪些changelist元件造成的错误。

如果设置nevents为零,你的错误代码,但没有迹象表明这些事件引起的误差。

所以EV_RECEIPT允许您设置nevents到一个非零值不会消耗任何未决事件。

+0

好吧,这是有道理的,但它不与我链接的Apple示例中的代码相关联。该代码中的评论说:_创建kqueue并将其设置为监视SIGCHLD。使用10.5中新增的EV_RECEIPT标志来确保我们得到我们期望的结果 - 然而,它只用一个事件调用'kevent',使用'EV_RECEIPT',并且既不检查来自'kevent'的返回值也不检查返回事件。任何关于“我们得到我们所期望的”评论意味着什么的线索? - 或者在这种情况下使用'EV_RECEIPT'伪造? – davmac

+0

我认为在这种情况下,将'nevents'设置为零将实现相同的行为,因为未检查返回值。但是这可能是一个在其他代码中复制的模式,其中返回值*被检查。期望的是新过滤器被返回并且*不*等待事件。 –