当文件描述符可用于写入时,我正在尝试向套接字客户端发送缓冲区。
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()
被调用时,描述符暂时不可写,然后再次可用,这就是为什么你得到一个事件。
我将设法让一些有知识的人来回答这个问题。