2013-03-12 51 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