使用边缘触发的epoll,我应该循环发送吗?

Mar*_*ond 6 epoll epollet

我正在使用epoll来编写媒体服务器.fds都设置为非阻塞,我正在使用边缘触发事件.我知道对于EPOLLIN我需要循环读取fd,直到返回EAGAIN.但是写作呢?

当我想写时,我排队数据并在fd上设置EPOLLOUT | EPOLLIN | EPOLLET.当EPOLLOUT事件发生时,我一次写入整个排队的缓冲区:

n = send ( fd, buf, buf_len, MSG_NOSIGNAL );
Run Code Online (Sandbox Code Playgroud)

如果n> 0 && n <buf_len我只是重置EPOLLOUT并返回.我没有看到循环发送的意义(我认为epoll的手册页暗示).似乎发送已经表明它已经完全接受了它并且如果立即被调用将返回EAGAIN.

在这里取消系统调用是最有效的途径吗?

use*_*412 5

epoll 手册页说:

对于面向流的文件(例如管道、FIFO、流套接字),还可以通过检查从目标文件描述符读取/写入的数据量来检测读/写I/O空间耗尽的情况。 例如,如果您通过要求读取一定数量的数据来调用 read(2) 并且 read(2) 返回较少的字节数,则可以确定已用尽文件描述符的读取 I/O 空间。使用 write(2) 写入时也是如此。 (如果您不能保证受监控的文件描述符总是指向面向流的文件,请避免使用后一种技术。)