我正在使用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。
在这里取消系统调用是最有效的途径吗?
答案 0 :(得分:4)
对于面向流的文件(例如,管道,FIFO,流套接字),还可以通过检查从目标文件读取/写入的数据量来检测读/写I / O空间耗尽的情况。描述。 例如,如果通过要求读取一定数量的数据来调用read(2)并且read(2)返回较少的字节数,则可以确保已经耗尽了文件的读取I / O空间描述。使用write(2)编写时也是如此。(如果不能保证受监视的文件描述符始终引用面向流的文件,请避免使用后一种技术。)
答案 1 :(得分:0)
我做了很多测试,似乎循环播放是浪费时间。