我正在使用 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 的手册页暗示了这一点)。似乎 send 已经表明它已经接受了所有它可以并且如果立即调用将返回 EAGAIN。
在这里消除系统调用是最有效的途径吗?