linux - 关于epoll和splice的问题

标签 linux tcp epoll splice

我的应用程序要通过网络发送大量数据,所以我决定(因为我使用的是 Linux)使用 epoll 和 splice。这是我的看法(伪代码):

epoll_ctl (file_fd, EPOLL_CTL_ADD); // waiting for EPOLLIN event
while(1)
{
    epoll_wait (tmp_structure);

    if (tmp_structure->fd == file_descriptor)
    {
        epoll_ctl (file_fd, EPOLL_CTL_DEL); 
        epoll_ctl (tcp_socket_fd, EPOLL_CTL_ADD); // wait for EPOLLOUT event
    }

    if (tmp_structure->fd == tcp_socket_descriptor)
    {
        splice (file_fd, tcp_socket_fd);
        epoll_ctl (tcp_socket_fd, EPOLL_CTL_DEL); 
        epoll_ctl (file_fd, EPOLL_CTL_ADD); // waiting for EPOLLIN event
    }
}

我假设我的应用程序将打开多达 2000 个 TCP 套接字。我想问你两件事:

  1. epoll_ctl调用会比较多,我有这么多套接字会不会很慢?
  2. 文件描述符必须首先变为可读,并且在套接字变为可写之前会有一些间隔。我可以确定,在套接字变为可写文件描述符的那一刻仍然是可读的(以避免阻塞调用)?

最佳答案

第一个问题

  1. 您可以使用边缘触发而不是触发轮询,因此您不必每次都删除套接字。
  2. 您可以使用 EPOLLONESHOT 来防止移除套接字

File descriptor has to become readable first and there will be some interval before socket will become writable.

什么样的文件描述符?如果文件系统上的这个文件你不能为此目的使用选择/轮询或其他工具,文件将始终可读或可写,无论磁盘和缓存的状态如何。如果您需要执行异步操作,您可以使用 aio_* API,但通常只是从文件读取写入文件并假设它是非阻塞的。

如果它是 TCP 套接字,那么它在大多数情况下都是可写的。最好使用 当你得到 EWOULDBLOCK 时,非阻塞调用并将套接字放入 epoll。

关于linux - 关于epoll和splice的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4173024/

相关文章:

linux - 为 x86 和 ARM 编写平台设备驱动程序的区别

Linux-SUSE10操作系统中如何解决 'Word too long.'

linux - TCP 的初始重传超时是多少?

c++ - 如何在 Windows 上实现端口重定向/映射?

c# - 用C#简单快速地实现socket服务器

c - epoll 和发送滞后

c - 如何用 ALSA 播放短音

linux - 给定程序使用/usr/bin/time 的内存使用情况

c - epoll 文件描述符操作

c - 使用 epoll 停止单线程 C 服务器