我正在OS X中使用kqueue进行套接字同步。我可以像下面这样注册感兴趣的事件:
struct kevent change;
EV_SET(&change, connected_socket, EVFILT_READ, EV_ADD, 0, NULL, NULL);
kevent(k_queue_, &change, 1, NULL, 0, NULL);
问题是,是否有一种方法可以强制触发此事件,以便等待kevent调用将返回?
shutdown(2)
套接字的读端 - 您将在 flags
中得到EV_EOF
(傻瓜),我的问题是:您为什么需要这个?
如果我正确理解您的评论,您正在寻找一种绕过写入事件的边缘触发行为 (EV_CLEAR
) 的方法。我认为正确的做法是在没有队列中的传出数据时从EVFILT_WRITE
中注销套接字,然后在有数据要发送时重新注册它。这是有点麻烦,但这就是它的工作原理,而且由于kevent(2)
接受更改和结果,您不需要任何额外的系统调用。看看libevent
如何处理这种情况。你使用非阻塞套接字,对吗?
OSX 10.6和FreeBSD 8.1增加了对EVFILT_USER
的支持,我们可以使用它来从另一个线程唤醒事件循环。
请注意,如果您使用此功能来实现自己的条件和定时等待,您仍然需要锁以避免竞争条件,如这个优秀答案所解释的。
查看我的其他答案,获取完整的代码示例:https://dev59.com/vmgu5IYBdhLWcg3wZma8#31174803
http://www.opensource.apple.com/source/xnu/xnu-1699.24.23/tools/tests/xnu_quick_test/kqueue_tests.c
select(2)
和poll(2)
一样。祝你好运! - Nikolai Fetissov