2013-01-16 57 views
0

我對使用管道數據更便攜但最快的方式感興趣。消耗管道數據的最佳方式是什麼?

例如,在linux下我能想到的最快的方法是:

#define _GNU_SOURCE 
/* ... */ 
int fd; 
int pipefd[2]; 

pipe(pipefd); 

/* ... */ 
fd = open("/dev/null", O_WRONLY); 
splice(pipefd[0], NULL, fd, NULL, INT_MAX, SPLICE_F_MOVE); 

...但它不便於攜帶。

更新1:

如果我關閉整個管道,並創建一個每次我需要它?

/*consume*/ 
close(pipefd[0]); 
close(pipefd[1]); 

它會比使用其他方法,即read()/ write()更快嗎?

+0

'pipe'符合POSIX標準,所以它可以在符合POSIX的系統上移植。不過,「splice」只是Linux系統調用。 – nhahtdh

+0

爲什麼要使用管道中的數據? [你真正的問題是什麼?](http://mywiki.wooledge.org/XyProblem) – thkala

+0

@thkala我只想從管道中消耗數據。我正在實現一個服務器,**例如**,假設有一個傳入連接,服務器處理請求並準備所有必需的事情以迴應客戶端,但發生了一些事情;客戶端關閉了連接。在這一點上,服務器不能迴應客戶端,現在服務器需要從中恢復以處理其他請求。 現在,您將如何處理之前由服務器填充的pipefd [0]內的數據?國際海事組織,或者你cosume數據或關閉管道。 – yeyo

回答

2

您確定此操作對您的程序性能至關重要嗎?如果不是的話,只需使用最簡單的工作方式,可能是沿着C行的cat the_pipe > /dev/null或其等價物,循環讀取(2)當前Linux上的數據塊(例如4KiB,或者可能獲得「最佳」尺寸一個管道中的最大數據是64KiB;看一下管道(7))。 也許更容易關閉數據的生產者而不是讓它丟掉它?在性能方面,這是不能被打敗的......

+0

事實上,這不是應用程序的瓶頸。正如你所說的,最好的方法是使用更大的緩衝區。儘管似乎libevent提供了一個便攜式零拷貝接口,它使用主操作系統提供的低級原語。對我來說,libevent非常有趣。 – yeyo

相關問題