2

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

这个问题被问到 UDP 套接字,但他们从未找到任何替代拼接的方法。

4

1 回答 1

2

严格接听模式

这是一个长镜头,但我想我记得fuse低级接口何时获得splice()支持。

所以,你可以实现一个保险丝驱动程序来做你想做的事。然而,这只有在你坚持拥有一个文件描述符兼容的接口时才有意义。我怀疑这是一项不平凡的工作,尽管像这样的项目ntfs-3g 可能已经实施了。


一起思考:

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

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

如果仅传递数据就足够了,您可能会在此处使用mmapwith splice

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'ed 缓冲区拼接到网络套接字时,无法确定所有数据何时已发送。即使splice()返回,网络堆栈也可能尚未发送所有数据。因此重用缓冲区可能会覆盖未发送的数据。

本 HowTo的背景信息

于 2014-04-16T18:35:41.020 回答