我有一个文件描述符,它可能来自可以读取的套接字、管道或实际文件。我有另一个可以写入的文件描述符(同样,可能代表套接字或实际文件)。我需要尽快将数据从一个传递到另一个。
目前,我知道没有办法做到这一点,除了选择任意缓冲区大小,从第一个描述符读取它,然后将其写入第二个描述符(如果它无法写入读取的所有内容,则可能需要一个循环)一气呵成)。相反,我希望能够说“从这个文件描述符读取并将数据直接放入that文件描述符中,而不需要中间缓冲区”——或者更好的是,“从这个文件描述符读取直到它命中” EOF,并尽快将其全部直接放入 that 文件描述符中。”在我看来,应该有一种方法可以做到这一点,而不需要绕道用户空间,并支付将数据从内核缓冲区复制出来然后再次复制回内核缓冲区的费用,但我找不到任何这样的方法,我在 google 上想到的每一个短语都只会引导我找到有关 UNIX shell 管道的内容。有办法做到这一点,还是我只是被困住了?
sendfile()
、
splice()
、copy_file_range()
和 ioctl_ficlone()
。除了 sendfile()
、
splice()
和 copy_file_range()
(@n.m. 在评论中提到可能是 AI)之外,Linux 还具有 ioctl_ficlone()
。但是这些系统调用都不适用于所有文件类型。我建议这样做:
#include <sys/ioctl.h>
#ifdef FICLONE
来检测 ioctl_ficlone()
。如果失败(不支持或未定义 FICLONE
copy_file_range()
调用 _syscall()
。如果失败,请尝试 sendfile()
splice()
。如果所有这些都失败,请回退到在循环中使用 write()
read()
,读取和写入 64-256K 字节的块。