C语言 EVFILT_WRITE返回两次



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

EV_SETEVFILT_WRITE, EV_ADD | EV_DISABLE | EV_CLEAR

thenEVFILT_WRITE, EV_ENABLE然后EVFILT_WRITE被触发一次真是太棒了!

,但如果我使用函数发送当我得到EVFILT_WRITE这样的:

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

然后我再次得到另一个EVFILT_WRITE事件。似乎send函数触发了另一个EVFILT_WRITE事件。这是预期行为吗?我认为EVFILT_WRITE仅在文件描述符可用于写入时触发。

我搜索了这个问题,但似乎没有人提到。有人可以确认这是否是预期的行为,为什么?

我是这样理解的:

由于您使用了EV_CLEAR,kevent设施开始返回状态转换,而不是当前状态。因此,每当您使用kevent()send()调用触摸socket描述符时,您将获得EVFILT_WRITE事件返回。

另一种看待这个的方式:

send()被调用时,描述符暂时不可写,然后再次可用,这就是为什么你得到一个事件。

我将设法让一些有知识的人来回答这个问题。

最新更新