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

7
我正在使用epoll编写媒体服务器。所有fds都设置为非阻塞,并且我正在使用边缘触发事件。我知道对于EPOLLIN,我需要循环读取fd,直到返回EAGAIN。但是写入呢?
当我想要写入时,我将数据排队,并在fd上设置EPOLLOUT | EPOLLIN | EPOLLET。当EPOLLOUT事件发生时,我一次性写入整个排队的缓冲区:
n = send ( fd, buf, buf_len, MSG_NOSIGNAL );

如果n大于0并且小于buf_len,我只是重置EPOLLOUT并返回。我认为没有必要循环发送(我认为epoll的man页面暗示了这一点)。似乎send已经表明它已经接收了所有可以接收的内容,并且如果立即调用会返回EAGAIN。
在这里消除一个系统调用是否是最有效的方法?
2个回答

5

epoll手册中提到:

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


0

我已经做了很多测试,似乎循环发送是浪费时间的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接