当使用kqueue
与该事件类型相关的 ID 注册事件时;例如,文件描述符用于标识要监视的文件
int kq;
struct kevent ke;
kq = kqueue();
fd = open(argv[1], O_RDONLY);
EV_SET(&ke, fd, EVFILT_VNODE, EV_ADD, NOTE_DELETE | NOTE_RENAME, 0, NULL);
kevent(kq, &ke, 1, NULL, 0, NULL);
while (1) {
kevent(kq, NULL, 0, &ke, 1, NULL);
/* respond to file system event */
}
ident
现在,如果我还需要响应其他事件类型这样的信号,我们需要一个新的kqueue
实例,以避免与kevent()
.
kq_sig = kqueue();
struct kevent ke_sig;
/* set the handler and ignore SIGINT */
signal(SIGINT, SIG_IGN);
EV_SET(&ke_sig, SIGINT, EVFILT_SIGNAL, EV_ADD, 0, 0, NULL);
kevent(kq_sig, &ke_sig, 1, NULL, 0, NULL);
while (1) {
kevent(kq_sig, NULL, 0, &ke_sig, 1, NULL);
/* respond signals */
}
观察一种以上的事件类型似乎需要多个线程来作用于共享状态(例如,接收信号可能会关闭文件描述符)。
是否有更通用的机制来使用 kqueue 从一个线程向另一个线程发送消息?在某些情况下,我可以设想启用和禁用过滤器作为边缘触发另一个 kevent 的一种方式。