两个文件描述符之间的桥接

时间:2013-03-12 06:51:45

标签: c linux sockets file-descriptor

我有一个套接字我正在做select(),等待其他进程写入。 一旦写入,我读取数据,并将其写入另一个文件描述符。 我的问题是,如果有一种方法可以将套接字桥接到文件描述符,那么当数据就绪时,它会自动写入另一个文件描述符吗?

这样,我可以抛出我正在使用的缓冲区,并省略系统中的一个线程。

2 个答案:

答案 0 :(得分:6)

在Linux上,使用splice()可能更合适,方向是从socket到file。使用splice()稍微复杂一些,但是你可以得到两个方向。另外,我认为sendfile最近使用了拼接internally

有很多关于SO的问题已经讨论过splice()和sendfile()之间的区别。在网上搜索还会发现有关拼接工作原理(来源和目的地)的相互矛盾的陈述。了解它是否适​​合您的情况的最佳方法是测试它。

关于兼容的文件系统:Which file systems support splicing via Linux's splice(2)?

关于不支持TCP套接字拼接的旧内核:Does Linux's splice(2) work when splicing from a TCP socket?

Splice解释说: http://kerneltrap.org/node/6505

接头来源: http://lxr.linux.no/#linux+v3.8.2/fs/splice.c

答案 1 :(得分:4)

很抱歉,如果我误解了你的情况,但你的意思是sendfile吗?

  

sendfile - 在文件描述符之间传输数据

#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t * offset ", size_t" " count" );
     

sendfile()在一个文件描述符和另一个文件描述符之间复制数据。因为这种复制是在内核中完成的,所以sendfile()比read(2)和write(2)的组合更有效,这需要将数据传入和传出用户空间。