2008-10-10 82 views

回答

20

我知道的一個區別是Linux下的命名管道是文件系統中的實際條目(你會在目錄列表中看到它們,它們有一個特殊類型),而在Windows中它們存儲在一些神奇的(通過路徑「\\。\ pipe \」訪問它們全部)

其次,在Linux中,您可以使用標準文件IO方法直接從管道寫入/讀取,就好像它們是任何其他文件一樣。在Windows上,你必須使用屬於Win32 API的特殊「管道」功能。

我更喜歡linux的方法,因爲它可以讓我用任何我想要的應用程序使用管道,例如:

mkfifo pipe.wav 
decodeMP3 song.mp3 --out pipe.wav & 
encodeAVI video.mpeg pipe.wav --out video.avi 

這使我可以將MP3解碼器的輸出直接傳輸到視頻解碼器,而不必先將整個MP3解碼成磁盤上的WAV文件。如果你有一個雙核CPU,這很方便,因爲這樣你就可以同時運行兩個操作,從而獲得不錯的加速。

+1

Downvote。在Windows上,我可以使用CreateFile,ReadFile,WriteFile,ReadFileEx,WriteFileEx函數來命名管道。只有服務器必須使用CreateNamedPipe。有管道的功能用於管道創建和綁定的同步,但如果不需要聯網管道,可以使用命名的等待事件來替換這些功能。 – 2013-01-25 10:06:49

+1

而Windows本地命名管道在下面使用內存映射文件。這意味着管道將數據存儲在內存或pagefile.sys中。 – 2013-01-25 10:14:17

5

在Linux(和* ix一般)下,「​​一切都是文件」。您可以在沒有限制的情況下讀取/寫入/查找管道和套接字和設備,只要這些操作合理。

儘管Windows對於這些不同類型的對象有着非常不統一的體系結構。雖然我不能告訴你細節,但我知道Windows和Linux之間管道的緩衝區有很大不同,所以你可能會遇到困難。另外,Unix-y管道的一個普通用途是fork()一個子進程,然後通過一個管道(父進程打開一端,子進程打開另一端)與進程通信。在Windows下,這種事情是不可能的。 IPC機制完全不同。

1

另一個重要區別

在windows下

A | B | C 

,直到完成了它的輸出噸B不開始讀取,同爲B輸出被C

讀取

* nix的鉤的輸入和輸出在一起,使得C能夠讀取B的輸出和B可以讀取A的輸出,而A和B仍在運行

吞吐量大致相同,但使用* nix時輸出顯示更快。

相關問題