我试图在C++程序中尽可能快地将数据从一个UDS传递到另一个UDS,但是UDS的UDS不支持接合 (如fd_in)。是否有任何由UDS支持的替代方案尽可能接近于零拷贝?
这个问题被要求使用UDP套接字,但他们从未找到任何替代连接的方法。
发布于 2014-04-16 18:35:41
严格应答模式
这是一个很长的机会,但我想我还记得当fuse低级别接口获得splice()支持时。
所以,你可以实现一个保险丝驱动程序来做你想做的事。但是,只有当坚持具有与文件描述符兼容的接口时,这才有意义。我怀疑这是一个相当大的工作量,尽管像ntfs-3g这样的项目可能会实现它。
思考:
现在,你想达到什么目的?
根据我的经验,UNIX域套接字只用于机器内部进程间通信,而且数据的使用者可能实际上对接口的文件/流性质并不感兴趣。
如果只传递数据就足够了,那么您可能在这里使用mmap和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的背景信息
https://stackoverflow.com/questions/23117285
复制相似问题