7

我正在使用 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。

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

4

2 回答 2

5

epoll 手册页说:

对于面向流的文件(如管道、FIFO、流套接字),也可以通过检查目标文件描述符读/写的数据量来检测读/写I/O空间耗尽的情况。 例如,如果您通过请求读取一定数量的数据来调用 read(2),而 read(2) 返回的字节数较少,则可以确定文件描述符的读取 I/O 空间已用尽。使用 write(2) 写入时也是如此。 (如果你不能保证被监控的文件描述符总是指向一个面向流的文件,请避免使用后一种技术。)

于 2012-02-23T16:33:48.203 回答
0

我做了一堆测试,似乎循环发送是浪费时间。

于 2011-07-07T17:23:05.943 回答