我有一个套接字我正在做select()
,等待其他进程写入。
一旦写入,我读取数据,并将其写入另一个文件描述符。
我的问题是,如果有一种方法可以将套接字桥接到文件描述符,那么当数据就绪时,它会自动写入另一个文件描述符吗?
这样,我可以抛出我正在使用的缓冲区,并省略系统中的一个线程。
答案 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
答案 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)的组合更有效,这需要将数据传入和传出用户空间。