当文件描述符可用于写入时,我尝试向套接字客户端发送缓冲区。
EV_SET设置为:执行过滤_写入,执行过滤_添加|EV_禁用|EV_清除
然后,当更改为EVFILT_WRITE、EV_ENABLE时,EVFILT_WRITE会触发一次,这非常棒!
但如果我在得到EVFILT_WRITE时使用函数write或send,如下所示:
if (e->filter == EVFILT_WRITE)
send(socket, buff, strlen(buff), 0);
然后我又得到了另一个EVFILT_WRITE事件。看起来发送函数触发了另一个EVFILT_WRITE事件。这是预期的行为吗?我认为EVFILT_WRITE只在文件描述符可用于写入时触发。
我搜索了这个问题,但看起来没有人提到这个问题。有人能确认这是否是预期的行为,为什么?
1条答案
按热度按时间fnvucqvd1#
我是这样理解的:
由于使用了
EV_CLEAR
,kevent
工具开始返回状态转换,而不是当前状态。因此,每当使用kevent()
或send()
调用触及socket
描述符时,都会返回一个EVFILT_WRITE
事件。换个Angular 来看:
当调用
send()
时,描述符暂时不可写,然后再次变为可用,这就是为什么会得到一个事件。我将设法让一些知识渊博的人回答这个问题。