作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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
看看它是如何处理这类事情的。您正在使用非阻塞套接字,对吧?
关于macos - 强行触发kevent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3354733/
我是一名优秀的程序员,十分优秀!