2013-03-12 50 views
9

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

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

+1

你为什么现在需要一个线程? – hyde 2013-03-12 08:00:41

+0

你能描述一下你想解决的问题吗?管道只是从特定的流中完成你想要的。您的问题是否与网络有关? – 2013-03-12 09:29:09

+0

@MichaelFoukarakis我正在为遗留代码开发一个守护进程的日志环境。我不能改变实现,无论如何,管道只能在相同的流程上下文中工作,这对我不起作用。 – stdcall 2013-03-12 11:41:44

回答

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)的组合效率更高,这将需要向用户空间传输数据和从用户空间传输数据。

+0

+1,我认为这是他想要的。 – StarPinkER 2013-03-12 07:08:13

+4

链接手册页的代码片段:* in_fd参数必须对应于支持类mmap(2)操作的文件(即,它不能是套接字)* – hyde 2013-03-12 07:55:55

+0

根据我的经验,sendfile速度更快... – 2013-03-12 09:27:08

6

在Linux上,使用splice()可能更适合,当方向是从套接字到文件。使用splice()稍微复杂一些,但是你可以得到两个方向。另外,我认为sendfile目前使用拼接internally

有很多问题已经讨论了splice()和sendfile()之间的区别。搜索网页还会发现关于什么(源和目标)拼接起作用的相互冲突的陈述。要知道它是否适合您的情况,最好的方法就是测试它。

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

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

拼接解释说: http://kerneltrap.org/node/6505

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