我试图理解kqueue中EV_DISABLE和EV_ENABLE的用例。
int KQueue = kqueue();
struct kevent ev = {
.ident = fd,
.filter = EVFILT_READ,
.flags = EV_ADD | EV_DISABLE,
.udata = somePtr
};
kevent(KQueue, &ev, 1, NULL, 0, NULL);
...
struct kevent ev = {
.ident = fd,
.filter = EVFILT_READ,
.flags = EV_ENABLE
};
kevent(KQueue, &ev, 1, &ev, 1, NULL);
现在,当最后一次调用
kevent()
返回时,ev.udata
是NULL
而不是somePtr
如果kevent()
即使未设置EV_ADD也会更新udata
指针,而不是仅启用事件,那么允许您添加禁用事件的原因是什么? 最佳答案
kqueue
没有更新udata
您未初始化就更新了udata
您正在用新值注册筛选器udata
的关键是与内核交叉您可以将自己的指针保存在userland
中。
禁用事件的意义在于,您希望它在另一个调用时返回,或者您不希望在触发时导致kqueue
返回,而是在不同的时间返回。
关于c - kqueue EV_ENABLE和EV_DISABLE的目的是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24476104/