我试图理解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.udataNULL而不是somePtr如果kevent()即使未设置EV_ADD也会更新udata指针,而不是仅启用事件,那么允许您添加禁用事件的原因是什么?

最佳答案

kqueue没有更新udata您未初始化就更新了udata您正在用新值注册筛选器udata的关键是与内核交叉您可以将自己的指针保存在userland中。
禁用事件的意义在于,您希望它在另一个调用时返回,或者您不希望在触发时导致kqueue返回,而是在不同的时间返回。

关于c - kqueue EV_ENABLE和EV_DISABLE的目的是什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24476104/

10-11 07:39