【问题标题】:can io_uring system call or any other system call be used by an application to transfer data from a socket to file while doing a zero copy?应用程序可以使用 io_uring 系统调用或任何其他系统调用将数据从套接字传输到文件,同时进行零复制吗?
【发布时间】:2021-02-06 05:06:09
【问题描述】:

是否有任何系统调用可以将数据从套接字复制到文件?我查看了 sendfile 系统调用,发现 input_fd 必须是文件描述符,所以我想知道在从套接字接收数据并将其存储在文件中时,应用程序是否可以利用任何系统调用进行零复制?

【问题讨论】:

    标签: operating-system system-calls


    【解决方案1】:

    (这看起来像 Understanding sendfile() and splice() 的副本)这个问题提问者在这里想知道从套接字读取的数据是否可以零复制到文件中,并且提到 io_uring 强烈表明提问者特别感兴趣Linux。

    简而言之,可以通过在 Linux 上使用splice(2) 从套接字接收并输出到文件,而不必制作不必要的重复副本,但这并非微不足道 - 套接字必须连接到管道的一端和文件的描述符到另一端。由于 5.7 Linux 内核 io_uring also supports a splice operation 所以它也可以通过管道从套接字到文件进行零复制。

    【讨论】:

    • 我正在查看是否存在可以从套接字执行零复制到本地文件的系统调用?所以我的问题中有两个描述符 1)一个套接字描述符 2)一个文件描述符。举一个更具体的例子,想象一个在特定套接字接收消息的 Web 服务器,它需要将它们存储到本地文件中。网络服务器可以做零拷贝吗?
    • 它需要一个文件描述符是一个管道。
    • 是的 sendfile 不能将套接字描述符作为 input_fd(输入文件描述符)。管道将两个文件描述符作为参数(input_fd,output_fd),其中一个必须是管道。在我的情况下,我希望 input_fd 是一个套接字。所以问题是管道可以是套接字吗?它可以按预期工作吗?我不知道答案。这就是为什么我在这里发布我的问题
    • 你能解释一下套接字如何成为管道吗?一个例子可能是如何使用拼接来做到这一点?
    • 是的,但是 sendfile 必须限制它一定是有原因的。所以我想了解那些
    猜你喜欢
    • 2011-06-26
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 2023-02-01
    • 1970-01-01
    • 2010-12-25
    相关资源
    最近更新 更多