Linux 关于epoll和拼接的问题

Linux 关于epoll和拼接的问题,linux,tcp,epoll,splice,Linux,Tcp,Epoll,Splice,我的应用程序将通过网络发送大量数据,所以我决定(因为我使用的是Linux)使用epoll和splice。以下是我的看法(伪代码): 我假设,我的应用程序将打开多达2000个TCP套接字。我想问你两件事: 将会有很多epoll\u ctl调用,当我有这么多套接字时,不会很慢吗 文件描述符必须首先变为可读的,并且在套接字变为可写之前会有一段时间间隔。我可以确定,当套接字变为可写时,文件描述符仍然是可读的(以避免阻塞调用) 第一项问题 您可以使用边缘触发轮询,而不是甚至触发轮询,这样您就不必每次都删除

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

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

  • 将会有很多epoll\u ctl调用,当我有这么多套接字时,不会很慢吗
  • 文件描述符必须首先变为可读的,并且在套接字变为可写之前会有一段时间间隔。我可以确定,当套接字变为可写时,文件描述符仍然是可读的(以避免阻塞调用) 第一项问题

  • 您可以使用边缘触发轮询,而不是甚至触发轮询,这样您就不必每次都删除套接字
  • 您可以使用EPOLONESHOT防止卸下插座
  • 文件描述符必须首先变为可读的,并且在套接字变为可写之前会有一段时间间隔

    什么样的文件描述符?如果文件系统上的此文件无法使用select/poll或其他工具进行此操作,则无论磁盘和缓存的状态如何,该文件都将始终可读写。如果您需要执行人员异步操作,您可以使用
    aio.*
    API,但通常只是从文件中读取并写入文件,并假定它是非阻塞的

    如果它是TCP套接字,那么它大部分时间都是可写的。最好使用
    非阻塞调用,并在获得eWoldBlock时将套接字放入epoll。

    考虑使用EPOLLET标志。这绝对是为了那个案子。使用此标志时,您可以以正确的方式使用事件循环,而无需取消注册(或修改模式打开)文件描述符,因为它是在epoll中首次注册的。:)享受吧

    我所说的“文件描述符”是指用open()系统调用打开的磁盘文件的描述符,所以我认为我的想法云可以很好地工作:)@Goofy,你不能对文件上的磁盘使用select/epoll,因为它们总是报告可读写性,即使操作可以阻止从磁盘带来数据。看见
    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
        }
    }