名前付きパイプの使用

開発中の z/OS® UNIX XL C/C++ アプリケーション・プログラムが、活動中の他のプロセスとの通信を行うためにそのアクティブ・プロセスを必要とするが、同じプログラムではない場合は、アプリケーション・プログラムをコーディングして 名前付きパイプ (FIFO ファイル)を作成します。 名前付きパイプによって、FIFO 方式のプロセス間でのデータ転送や プロセス実行の同期化が可能になります。 名前付きパイプの使用により、たとえパイプのもう一方の側のプロセスがどのようなプロセスであるかが 不明であっても、プロセス間での通信を行うことができます。 名前付きパイプは、 pipe() 関数を使用して作成された標準の名前なしパイプとは異なり、これらのパイプは、正しく許可されたプロセスに入出力操作を行うために使用できる実ファイルの作成に関連しています。

アプリケーション・プログラム内で、 mkfifo() 関数または mknod() 関数をコーディングすることによって、名前付きパイプを作成します。 作成時に、その FIFO に名前を与え、アクセス・モードを指定します。 そのアクセス・モードが、すべてのユーザーにその名前付きパイプの 読み取りと書き込みのアクセスを許すモードである場合、その名前を知っているすべてのプロセスが そのパイプを使用してデータの送受信を行うことができます。

各プロセスは、open() 関数を使用してその名前付きパイプにアクセスし、次に、read()write()、および close() などのファイルに通常の入出力関数を使用して、その名前付きパイプを操作できます。 名前付きパイプのアクセスや操作に、バッファー処理を伴う入出力関数も使用できます。 mkfifo() および mknod() の機能およびファイル入出力機能について詳しくは、 z/OS XL C/C++ ランタイム・ライブラリー・リファレンスを参照してください。

制約事項: マルチスレッド環境で fopen() を使用して名前付きパイプをオープンすると、デッドロックが起こります。 このデッドロックは、fopen() マルチスレッド mutex をまだ保持している間に、パイプの他方の端がオープンされるのを名前付きパイプが待つ場合に起こります。 このデッドロックが起こらないようにするには、fopen() の代わり に open() を用いて名前付きパイプをオープンしてください。

z/OS UNIX は、名前付きパイプのセキュリティー検査を行います

以下のステップは、 z/OS UNIX XL C/C++ アプリケーション・プログラムから名前付きパイプを使用する方法を示しています。

  1. mkfifo() 関数を使用して名前付きパイプを作成します。 これを行う必要があるのは、名前付きパイプを使用するプロセスの いずれか 1 つだけです。
  2. 適切な入出力方式を使用して名前付きパイプにアクセスします。
  3. ファイル入出力関数を使用して、そのパイプを介して他の プロセスと通信します。
    1. 名前付きパイプへデータを書き込みます。
    2. 名前付きパイプからデータを読み取ります。
  4. 名前付きパイプをクローズします。
  5. プロセスが名前付きパイプを作成し、その名前付きパイプが必要なくなった場合は、 unlink() 関数を使用してその名前付きパイプを除去してください。

以下の単純なプログラム例を実行するプロセスでは、 mkfifo() 関数にコーディングされた パス 値によって指し示されたファイル・パス名を持つ新しい名前付きパイプが作成されます。 新しい名前付きパイプのアクセス・モードは、 mkfifo() 関数にコーディングされている モード 値から初期設定されます。 モード引数のファイル許可ビットは、プロセスのファイル作成マスクによって修正されます。

例えば、 図 1 でプログラム・コード (CCNGHF2) を実行するプロセスでは、子プロセスが作成され、 15 番目のテストという名前付きパイプが作成されます。 子プロセスは、そのパイプ・ファイルにデータ・ストリングを書き込みます。 親プロセスは、パイプ・ファイルからの読み取りを行い、読み取ったデータ・ストリングが予期し たものであるかどうかを検査します。
注: これらの 2 つのプロセスは、関連があり、名前付きパイプによる通信に同意しています。 ただし、関連があることを必要とするわけではありません。 許可されている他のユーザーも、同じプログラムを実行して、プロセス通信に参加 (または干渉) できます。