差分

移動先: 案内検索

プロセス間通信

6 バイト除去, 2020年5月19日 (火) 05:42
/* 名前つきパイプ */
TBD
== 名前つきパイプ (named pipe) ==
その前にパイプを説明しましょう。コマンドラインでのシェルが持つパイプは、前のコマンドの標準出力を後ろのコマンドの標準入力にするというものです。使い勝手は、まるっきりファイルです。その前にパイプを説明しましょう。コマンドラインでのシェルが持つパイプは、前のコマンドの標準出力を後ろのコマンドの標準入力にするというものです。使い勝手は、まるっきりファイルです。
このようなプロセス間で一方向に書き出し、読み込みをするプログラムを書く時は、UNIXの初期からあるシステムコールとしてpipeこのようなプロセス間で一方向に書き出し、読み込みをするプログラムを書く時は、UNIXの初期からあるシステムコールとしてpipe(2)を使って実現します。 pipe(2) は、プロセス中で2つの要素を持つファイルデスクリプタ配列に対して、1つは書き込み、もう1つは読み込みのディスクリプタを与えるというものです。このペアを作っておき、プロセスがフォークすると、1つのプロセス側は書き込み、もう一つのプロセス側は読み込みができるようになります。もちろん一方向にしかデータは流れません。は、プロセス中で2つの要素を持つファイルデスクリプタ配列に対して、1つは書き込み、もう1つは読み込みのディスクリプタを与えるというものです。このペアを作っておき、プロセスがフォークすると、1つのプロセス側は書き込み、もう一つのプロセス側は読み込みができるようになります。もちろん一方向にしかデータは流れません。
さて、名前つきパイプは、それまでのプロセスがフォークして資源を継承するしかできない一方向に流れるパイプとは違い、2つの完全に独立に存在しているプロセス間でデータをやり取りするために作られたものです。さて、名前つきパイプは、それまでのプロセスがフォークして資源を継承するしかできない一方向に流れるパイプとは違い、2つの完全に独立に存在しているプロセス間でデータをやり取りするために作られたものです。
FIFO(First-In-First-Out)である名前つきパイプを作ります。これはファイルのように名前でアクセスできるFIFOの性質を持った双方向パイプを作ります。である名前つきパイプを作ります。これはファイルのように名前でアクセスできるFIFOの性質を持った双方向パイプを作ります。
まずコマンド mkfifo で名前つきパイプのファイルを作ります。ファイルといってもアクセスのために名前だけあって実態はパイプです。 で名前つきパイプのファイルを作ります。ファイルといってもアクセスのために名前だけあって実態はパイプです。 ls -l で見ると先頭がpがあるので、名前つきパイプであることがわかります。あとls で見ると先頭がpがあるので、名前つきパイプであることがわかります。あとls -Fとしてみると、npの後ろにFとしてみると、npの後ろに"|"がついて出力されます。これは名前つきパイプ(FIFO) のファイルであるという意味です。
この状態で2つのshellウインドウを開いてみてください。一つはnpを読む、もう一つではnpに書き込むことをしてみます。この状態で2つのshellウインドウを開いてみてください。一つはnpを読む、もう一つではnpに書き込むことをしてみます。
ここでは判りやすいように一方向にデータを送っている例を出していますが、このようにファイル名でアクセスするようにしてプロセス間の通信が出来るというのは、実にUNIXらしいやり方です。プログラム中から名前つきパイプを作る時はユーザ関数 ここでは判りやすいように一方向にデータを送っている例を出していますが、このようにファイル名でアクセスするようにしてプロセス間の通信が出来るというのは、実にUNIXらしいやり方です。プログラム中から名前つきパイプを作る時はユーザ関数 mkfifo(3)で作れます。 
== UNIXドメインソケット (ローカルIPC) ==