我有一个套接字,我在做它select()
,等待其他进程写入。 一旦写入,我读取数据,并将其写入另一个文件描述符。 我的问题是,如果有一种方法可以将套接字连接到文件描述符,那么当数据准备就绪时,它会自动写入其他文件描述符?两个文件描述符之间的桥接
这样,我可以抛出一个我正在使用的缓冲区,并省略系统中的一个线程。
我有一个套接字,我在做它select()
,等待其他进程写入。 一旦写入,我读取数据,并将其写入另一个文件描述符。 我的问题是,如果有一种方法可以将套接字连接到文件描述符,那么当数据准备就绪时,它会自动写入其他文件描述符?两个文件描述符之间的桥接
这样,我可以抛出一个我正在使用的缓冲区,并省略系统中的一个线程。
对不起,如果我误解你的情况,但你的意思是像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)的组合效率更高,这将需要向用户空间传输数据和从用户空间传输数据。
+1,我认为这是他想要的。 – StarPinkER 2013-03-12 07:08:13
链接手册页的代码片段:* in_fd参数必须对应于支持类mmap(2)操作的文件(即,它不能是套接字)* – hyde 2013-03-12 07:55:55
根据我的经验,sendfile速度更快... – 2013-03-12 09:27:08
在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?
你为什么现在需要一个线程? – hyde 2013-03-12 08:00:41
你能描述一下你想解决的问题吗?管道只是从特定的流中完成你想要的。您的问题是否与网络有关? – 2013-03-12 09:29:09
@MichaelFoukarakis我正在为遗留代码开发一个守护进程的日志环境。我不能改变实现,无论如何,管道只能在相同的流程上下文中工作,这对我不起作用。 – stdcall 2013-03-12 11:41:44