名前付きパイプとは何ですか?


回答:


153

WindowsシステムとPOSIXシステムの両方で、名前付きパイプは、同じマシンで実行されているプロセス間でプロセス間通信を行う方法を提供します。名前付きパイプが提供するのは、ネットワークスタックを巻き込むことによるパフォーマンスの低下なしにデータを送信する方法です。

着信要求のIPアドレス/ポートをリッスンするサーバーがあるように、サーバーは要求をリッスンできる名前付きパイプをセットアップすることもできます。どちらの場合も、クライアントプロセス(またはDBアクセスライブラリ)は、要求を送信するための特定のアドレス(またはパイプ名)を知っている必要があります。多くの場合、一般的に使用される標準のデフォルトが存在します(HTTPのポート80と同様に、SQLサーバーはTCP / IPのポート1433を使用します。名前付きパイプには\\。\ pipe \ sql \ query)。

追加の名前付きパイプを設定することにより、複数のDBサーバーを実行でき、それぞれに独自の要求リスナーがあります。

名前付きパイプの利点は、通常ははるかに高速であり、ネットワークスタックリソースを解放することです。

-ところで、Windowsの世界では、リモートマシンへの名前付きパイプを使用することもできますが、その場合、名前付きパイプはTCP / IPを介して転送されるため、パフォーマンスが低下します。ローカルマシンの通信には名前付きパイプを使用します。


1
欠点は何ですか?
lindhe

2
@lindheネットワーク全体での自動操作性はありません。一般に、実際に設定するのはより困難です。Windowsでの実装は、Unix / Unixのようなシステムとは異なります。かっこいいですが、パフォーマンスが必須でない限り、気にしないでしょう。
sudo 2018

43

UnixとWindowsにはどちらも「名前付きパイプ」と呼ばれるものがありますが、動作は異なります。Unixでは、名前付きパイプは一方向の通りであり、通常、リーダーとライターが1つずつあります。ライターが書き込み、リーダーが読み取ると、それがわかりますか?

Windowsでは、「名前付きパイプ」と呼ばれるものは、TCPソケットに似たIPCオブジェクトです。物事は双方向に流れることができ、いくつかのメタデータがあります(物事の資格情報を相手側で取得できます)。

Unixの名前付きパイプは、ファイルシステムでは特別なファイルとして表示され、シェルを含む通常のファイルIOコマンドでアクセスできます。Windowsのものはそうではなく、特別なシステムコールで開く必要があります(その後、通常のWin32ハンドルのように動作します)。

さらに混乱を招くのは、Unixに「Unixソケット」またはAF_UNIXソケットと呼ばれるものがあることです。


23

Linux Pipes
First In First Out(FIFO)のプロセス間通信メカニズム。


「|」で表されるコマンドラインの名前なしパイプ 2つのコマンドの間。

名前付きパイプ
FIFO特殊ファイル。作成したら、通常のファイルと同様にパイプを使用できます(開く、閉じる、書き込み、読み取りなど)。

コマンドラインから「myPipe」という名前付きパイプを作成するには(manページ):

mkfifo myPipe  

cから名前付きパイプを作成するには、「パス名」はパイプに設定する名前で、「モード」にはパイプに設定する権限が含まれます(manページ):

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);

2
「通常のファイルと同じようにパイプを使用できます」-完全には当てはまりません。パイプにtell()配置したりseek()、パイプに配置したりすることはできません。
nyov

19

ウィキペディアによると:

[...]従来のパイプは匿名で存在し、プロセスが実行されている間のみ存続するため、「名前なし」です。名前付きパイプはシステム永続的であり、プロセスの存続期間を超えて存在するため、使用されなくなったら「リンク解除」または削除する必要があります。プロセスは通常、名前付きパイプ(通常はファイルとして表示されます)に接続してIPC(プロセス間通信)を実行します。



7

パイプは、アプリケーション間でデータをストリーミングする方法です。Linuxでは、これを常に使用して、あるプロセスの出力を別のプロセスにストリーミングします。宛先アプリはその入力ストリームがどこから来るのかわからないため、これは匿名です。必要はありません。

名前付きパイプは、積極的に既存のパイプに引っ掛けとhooveringアップそのデータのだけの方法です。これは、プロバイダーがどのクライアントがデータを食べるかが分からない状況用です。


6

これはTechnetからの抜粋です(そのため、マーク付きの回答で名前付きパイプの方が速いと言う理由がわかりませんか?):

名前付きパイプとTCP / IPソケット

高速ローカルエリアネットワーク(LAN)環境では、伝送制御プロトコル/インターネットプロトコル(TCP / IP)ソケットと名前付きパイプクライアントは、パフォーマンスに関して同等です。ただし、TCP / IPソケットと名前付きパイプクライアントのパフォーマンスの違いは、ワイドエリアネットワーク(WAN)やダイヤルアップネットワークなどの低速ネットワークでは明らかになります。これは、プロセス間通信(IPC)メカニズムがピア間で通信するさまざまな方法が原因です。

名前付きパイプの場合、ネットワーク通信は通常、より対話的です。ピアは、別のピアが読み取りコマンドを使用してデータを要求するまで、データを送信しません。通常、ネットワークの読み取りには、データの読み取りを開始する前に、一連のピーク名前付きパイプメッセージが含まれます。これらは低速ネットワークでは非常にコストがかかり、過剰なネットワークトラフィックを引き起こし、それが他のネットワーククライアントに影響を与える可能性があります。

ローカルパイプとネットワークパイプのどちらについて話しているのかを明確にすることも重要です。SQL Serverのインスタンスを実行しているコンピューターでサーバーアプリケーションがローカルで実行されている場合、ローカルの名前付きパイププロトコルはオプションです。ローカルの名前付きパイプはカーネルモードで実行され、非常に高速です。

TCP / IPソケットの場合、データ伝送はより合理化され、オーバーヘッドが少なくなります。データ送信では、ウィンドウ処理、遅延確認応答などのTCP / IPソケットパフォーマンス拡張メカニズムを利用することもできます。これは、低速ネットワークで非常に役立ちます。アプリケーションのタイプによっては、このようなパフォーマンスの違いが大きくなる場合があります。

TCP / IPソケットは、バックログキューもサポートします。これにより、SQL Serverに接続しようとしたときにパイプビジーエラーが発生する可能性がある名前付きパイプと比較して、制限されたスムージング効果が得られます。

一般に、TCP / IPは低速のLAN、WAN、またはダイヤルアップネットワークに適していますが、ネットワーク速度が問題にならない場合は、名前付きパイプの方がより適切な選択肢になります。


5

(主に)Windowsアプリケーションのプロセス間通信。ソケットを使用してUnixのアプリケーション間で通信するのと同じです。

MSDN


4
名前付きパイプは、1975年頃V6またはAT&T UNIXで登場
dmckee ---元司会者の子猫

どー!それはマイクロソフトより少し前のことです。私の知る限り、Unix / Linuxアプリケーションではあまり使用されていません。ほんと?
ケン

私はランダム署名ジェネレーターに名前付きパイプを使用しています-メールアプリとusenetアプリは$ HOME / .signatureという名前のファイルに署名があることを想定しているため、プログラムは.signatureを名前付きパイプとして作成し、それにランダムな引用を書き込みます。
ポールトンブリン

3

シェルは他のものと何も共有できないため、unix / linuxコンテキストの名前付きパイプを使用して、2つの異なるシェルを作成して通信できます。

さらに、同じシェルで2回インスタンス化された1つのスクリプトは、2つのインスタンスを介して何も共有できません。start()関数とstop()関数を含むデーモンをコーディングするときに、名前付きパイプの使用法を見つけ、同じスクリプトを使用して2つのアクションを実行したいと思いました。

名前付きパイプ(または任意の種類のセマフォ)がなくても、スクリプトをバックグラウンドで開始しても問題はありません。それが完了すると、バックグラウンドでインスタンスにアクセスできなくなります。

したがって、彼に停止コマンドを送信する場合は、できません。名前付きパイプなしで同じスクリプトを実行し、stop()関数を呼び出しても、実際には別のインスタンスを実行しているため、何も実行されません。

解決策は、デーモンを起動するときに、1つの読み取りともう1つの書き込みの2つのパイプを実装することでした。次に、他のタスクの中で、READパイプをリッスンするようにします。次に、Stop()関数には、メッセージをパイプに書き込むコマンドが含まれています。このコマンドは、exit 0を実行するバックグラウンド実行スクリプトによって処理されます。このように、同じスクリプトの2番目のインスタンスには、実行するタスクのみがあります。最初のインスタンスに停止を通知します。

このようにして、1つだけのスクリプトがそれ自体を開始および停止できます。

もちろん、たとえばタッチで停止をトリガーすることにより、さまざまな方法で実行できます。しかし、これはコードを書くのに便利で興味深いものです。


1

名前付きパイプは、プロセス間通信用のWindowsシステムです。SQLサーバーの場合、サーバーがクライアントと同じマシン上にある場合、TCP / IPではなく、名前付きパイプを使用してデータを転送できます。


あなたの答えがそれを表示させるので、それはウィンドウズのみではありません。他の人がすでに述べたように、名前付きパイプは70年代からUNIXに存在し、一般に特殊ファイルのように見えました。とにかく賛成ですが、あなたの答えを修正してください。
Chris Charabaruk、2008年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.