kqueue机制有一个事件标志EV_RECEIPT,根据链接的手册页:
..。对于在不耗尽任何挂起事件的情况下对kqueue进行大容量更改非常有用。当作为输入传递时,它将强制始终返回
EV_ERROR。成功添加筛选器时,数据字段将为零。
然而,我的理解是,只需将nevents参数的0传递给kevent,从而不从队列中提取任何事件,对kqueue进行批量更改就很简单了。考虑到这一点,为什么EV_RECEIPT是必要的?
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);但是,由于changes数组在kevent调用之后从未被检查过,我完全不清楚为什么在这种情况下使用EV_RECEIPT。
实际上是必要的EV_RECEIPT吗?在什么情况下它才是真正有用的呢?
发布于 2016-06-09 17:17:18
如果您正在进行批量更改,其中之一会导致错误,则该事件将放置在eventlist中,EV_ERROR设置在flags中,系统错误放在data中。
因此,可以确定是哪个changelist元素导致了错误。
如果将nevents设置为零,则会得到错误代码,但没有指示是哪个事件导致了错误。
因此,EV_RECEIPT允许您将nevents设置为非零值,而无需耗尽任何挂起的事件。
https://stackoverflow.com/questions/37731435
复制相似问题