C语言 EVFILT_WRITE返回两次

nimxete2  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(120)

当文件描述符可用于写入时,我尝试向套接字客户端发送缓冲区。

EV_SET设置为:执行过滤_写入,执行过滤_添加|EV_禁用|EV_清除

然后,当更改为EVFILT_WRITE、EV_ENABLE时,EVFILT_WRITE会触发一次,这非常棒!
但如果我在得到EVFILT_WRITE时使用函数writesend,如下所示:

if (e->filter == EVFILT_WRITE)
send(socket, buff, strlen(buff), 0);

然后我又得到了另一个EVFILT_WRITE事件。看起来发送函数触发了另一个EVFILT_WRITE事件。这是预期的行为吗?我认为EVFILT_WRITE只在文件描述符可用于写入时触发。
我搜索了这个问题,但看起来没有人提到这个问题。有人能确认这是否是预期的行为,为什么?

fnvucqvd

fnvucqvd1#

我是这样理解的:
由于使用了EV_CLEARkevent工具开始返回状态转换,而不是当前状态。因此,每当使用kevent()send()调用触及socket描述符时,都会返回一个EVFILT_WRITE事件。
换个Angular 来看:
当调用send()时,描述符暂时不可写,然后再次变为可用,这就是为什么会得到一个事件。
我将设法让一些知识渊博的人回答这个问题。

相关问题