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

时间:2011-07-05 15:00:23

标签: epoll epollet

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

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

n = send ( fd, buf, buf_len, MSG_NOSIGNAL );

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

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

2 个答案:

答案 0 :(得分:4)

epoll man页面说:

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

答案 1 :(得分:0)

我做了很多测试,似乎循环播放是浪费时间。