我正在使用epoll编写媒体服务器。所有fds都设置为非阻塞,并且我正在使用边缘触发事件。我知道对于EPOLLIN,我需要循环读取fd,直到返回EAGAIN。但是写入呢?
当我想要写入时,我将数据排队,并在fd上设置EPOLLOUT | EPOLLIN | EPOLLET。当EPOLLOUT事件发生时,我一次性写入整个排队的缓冲区:
如果n大于0并且小于buf_len,我只是重置EPOLLOUT并返回。我认为没有必要循环发送(我认为epoll的man页面暗示了这一点)。似乎send已经表明它已经接收了所有可以接收的内容,并且如果立即调用会返回EAGAIN。
在这里消除一个系统调用是否是最有效的方法?
当我想要写入时,我将数据排队,并在fd上设置EPOLLOUT | EPOLLIN | EPOLLET。当EPOLLOUT事件发生时,我一次性写入整个排队的缓冲区:
n = send ( fd, buf, buf_len, MSG_NOSIGNAL );
如果n大于0并且小于buf_len,我只是重置EPOLLOUT并返回。我认为没有必要循环发送(我认为epoll的man页面暗示了这一点)。似乎send已经表明它已经接收了所有可以接收的内容,并且如果立即调用会返回EAGAIN。
在这里消除一个系统调用是否是最有效的方法?