我正在尝试在C++程序中尽快将数据从一个UDS传递到另一个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++ - 使用Unix域套接字(UDS)的splice(2)的替代方案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23117285/

10-12 18:41