WindowsとLinuxのパイプの違いは何ですか?
-
08-07-2019 - |
質問
WindowsとLinuxのパイプの違いは何ですか?
解決
私が知っている1つの違いは、Linuxでは名前付きパイプがファイルシステムの実際のエントリであるということです(ディレクトリリストに表示され、特別なタイプがあります)が、Windowsでは魔法のリポジトリに格納されますどこか(これらはすべて、パス "quot。\\。\ 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全体をディスク上のWAVファイルにデコードする代わりに、MP3デコーダーの出力を直接ビデオデコーダーにパイプできます。デュアルコアCPUを使用していると便利です。両方の操作を一度に実行しているため、高速化が実現します。
他のヒント
Linux(および* ix一般)では、「すべてがファイル」です。パイプ、ソケット、およびデバイスの読み取り/書き込み/シークは、これらの操作が意味をなす限り制限なしで実行できます。
一方、Windowsには、これらのさまざまな種類のオブジェクトに対してはるかに統一性の低いアーキテクチャがあります。詳細を説明することはできませんでしたが、WindowsとLinuxではパイプのバッファリングがかなり異なるため、そこで問題が発生する可能性があります。
また、Unix-yでのパイプの一般的な使用法の1つは、サブプロセスを fork()
してから、パイプを介して通信することです(親が一方を開き、子が他方を開きます)。 Windowsでは、そのようなことは不可能です。 IPCメカニズムはまったく異なります。
別の重要な違い
ウィンドウの下
A | B | C
Aが出力されるまで、出力Bは読み取りを開始しません。B出力がCによって読み取られる場合も同じです
* nixは、CとBの出力を読み取り、AとBの実行中にBがAの出力を読み取ることができるように、入力と出力を一緒にフックします
スループットはほぼ同じですが、出力は* nixでより速く表示されます。