gpt4 book ai didi

c++ - splice(2) 与 Unix 域套接字 (UDS) 的替代方案

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:52 29 4
gpt4 key购买 nike

我试图在 C++ 程序中尽快将数据从一个 UDS 传递到另一个,但 UDS 不支持 splice (如 fd_in)。 UDS 是否支持尽可能接近零拷贝的替代方案?

This question被要求提供 UDP 套接字,但他们从未找到任何拼接的替代方案。

最佳答案

严格应答模式

这是一个远景,但我想我记得 fuse 低级接口(interface)何时获得了 splice() 支持。

因此,您可以实现一个 fuse 驱动程序来执行您想要的操作。然而,这只有在您坚持拥有一个文件描述符兼容的接口(interface)时才有意义。我怀疑这是一项非常重要的工作,尽管像 ntfs-3g 这样的项目可能有它实现。


一起思考:

现在,你想达到什么目的?

根据我的经验,UNIX 域套接字仅用于机器内的进程间通信,而且数据的消费者很可能实际上对接口(interface)的文件/流性质不感兴趣。

如果只传递数据就够了,你可以在这里使用 mmapsplice:

int fd;
char tmpfile[] = "/tmp/fooXXXXXX";
void *buffer;
int pfd[2];
ssize_t bytes;

fd = mkostemp(tmpfile, O_NOATIME);
unlink(tmpfile);
lseek(fd, 4095, SEEK_SET);
write(fd, "", 1);
lseek(fd, 0, SEEK_SET);
buffer = mmap(NULL, 4096, PROT_READ, MAP_PRIVATE, fd, 0);

pipe(pfd);
bytes = splice(s, NULL, pfd[1], NULL, 4096, SPLICE_F_MOVE);
splice(pfd[0], NULL, fd, NULL, bytes, SPLICE_F_MOVE);

注意:请注意,当将数据从 mmap 缓冲区拼接到网络套接字时,无法确定所有数据何时已发送。即使 splice() 返回,网络堆栈可能还没有发送所有数据。因此重用缓冲区可能会覆盖未发送的数据。

来自 this HowTo 的背景信息

关于c++ - splice(2) 与 Unix 域套接字 (UDS) 的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23117285/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com