前へ | 次へ | 目次 | 索引 |
シグナル・キャッチ関数の実行かプロセスの終了を引き起こすアクションを持つシグナルが送信されるまで,呼び出し元プロセスを一時停止します。
#include <unistd.h>int pause (void);
pause関数は,シグナル・キャッチ関数の実行かプロセスの終了を引き起こすアクションを持つシグナルが送信されるまで,呼び出し元プロセスを一時停止します。アクションがプロセスの終了だった場合, pauseは返りません。
アクションがシグナル・キャッチ関数の実行だった場合, pauseはそのシグナル・キャッチ関数が返った後に返ります。
pause 関数は,シグナルに割り込まれるまでプロセスの実行をいつまでも一時停止するため,成功を示す戻り値はありません。 - 1 pause が返る場合,戻り値は - 1 で, errno は EINTR に設定されます。
プロセスへのパイプをクローズします。
#include <stdio.h>int pclose (FILE *stream);
stream
以前の popen関数の呼び出しから返された,オープン・パイプの FILE構造体へのポインタ。
pclose関数は,呼び出し元プログラムと,実行されるシェル・コマンドの間のパイプをクローズします。 pcloseは, popenでオープンした任意のストリームをクローズする目的に使用します。 pclose関数は,対応するプロセスが終了するのを待ってから,コマンドの終了ステータスとともに返ります。終了ステータスの解釈については, waitpidの説明を参照してください。OpenVMS バージョン 7.3-1 から, _VMS_WAIT マクロを定義してコンパイルした場合, pclose関数は子プロセスの OpenVMS 完了コードを返すようになりました。
popenも参照してください。
x 子プロセスの終了ステータス。 - 1 エラーを示します。 stream 引数は popen 関数に関連付けられていません。 errno は以下の値に設定されます。
- ECHILD---子プロセスのステータスを取得できない。
stderrに, errnoの現在の値を記述する短いエラー・メッセージを書き込みます。
#include <stdio.h>void perror (const char *str);
str
通常は,エラーを引き起こしたプログラムの名前。
perror関数は,外部変数 errnoのエラー番号を使用して,適切なロケール依存のエラー・メッセージを取得します。この関数が出力するメッセージは, str (ユーザ提供のエラー・メッセージに対する接頭辞),コロンとスペース,メッセージそのもの,そして改行文字から構成されます。発生する可能性のあるエラーのリストについては,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 4 章の errnoの説明を参照してください。
strerrorも参照してください。
#include <stdio.h> #include <stdlib.h> main(argc, argv) int argc; char *argv[]; { FILE *fp; fp = fopen(argv[1], "r"); /* Open an input file. */ if (fp == NULL) { /* If the fopen call failed, perror prints out a */ /* diagnostic: */ /* */ /* "open: <error message>" */ /* This error message provides a diagnostic explaining */ /* the cause of the failure. */ perror("open"); exit(EXIT_FAILURE); } else fclose(fd) ; }
親プロセスと子プロセスの間でデータの読み書きに使用できる一時的なメールボックスを作成します。プロセスが通信に使用するチャネルは,パイプと呼ばれます。
#include <unistd.h>int pipe (int array_fdscptr[2]); (ISO POSIX-1)
int pipe (int array_fdscptr[2], ...); (HP C Extension)
array_fdscptr
ファイル記述子の配列。パイプは,メールボックスに関連付けられたファイル記述子の配列としてインプリメントされます。これらのメールボックス記述子は, isapipe関数に渡されたときに 1 を返すファイル記述子であるという点で特殊な存在です。ファイル記述子は,次のように割り当てられます。
- 最初の利用可能なファイル記述子が書き込みに割り当てられ,次の利用可能なファイル記述子が読み込みに割り当てられる。
- その後,ファイル記述子は配列に逆順に格納される。要素 0 には読み込みのためのファイル記述子が格納され,要素 1 には書き込みのためのファイル記述子が格納される。
...
3 つのオプションの定位置引数 flag, bufsize,およびbufquota を表します。flag
ビットマスクとして使用されるオプションの引数。O_NDELAY または O_NONBLOCK ビットが設定されていると, array_fdscptr ファイル記述子を通してのメールボックスへの I/O 操作は,他のプロセスを待つのではなく,ただちに終了します。
たとえば,O_NDELAY ビットが設定されており,親プロセスがメールボックスにデータを入れる前に,子プロセスがメールボックスに対する read要求を発行すると, readは 0 ステータスでただちに終了します。 O_NDELAY ビットも O_NONBLOCK ビットも設定されていない場合は,子プロセスは,親プロセスがメールボックスにデータを書き込むまで待ってから読み込みを行います。これは,flag 引数が指定されなかった場合のデフォルトの動作です。
O_NDELAY と O_NONBLOCK の値は <fcntl.h>ヘッダ・ファイルに定義されています。 flag 引数の中のその他のビットはすべて無視されます。この引数は,第 2 のオプションの定位置引数 bufsize が指定されている場合には,必ず指定する必要があります。 bufsize 引数を指定するためだけの目的に flag 引数を指定する場合には,flag として 0 を指定してください。
bufsize
メールボックスのサイズをバイト単位で指定する int型の引数 (オプション)。 512 〜 65535 の値を指定します。この引数に 0 を指定するか,この引数を省略すると,オペレーティング・システムはデフォルトのサイズ (512 バイト) のメールボックスを作成します。
0 より小さい,または 65535 より大きい値を指定すると,予期できない結果となります。
この引数を指定する場合は, flag 引数を前に指定してください。
DECC$PIPE_BUFFER_SIZE 機能論理名を使用しても,メールボックスのサイズを指定できます。 bufsize を指定すると, DECC$PIPE_BUFFER_SIZE の値よりも優先されます。指定しないと,DECC$PIPE_BUFFER_SIZE の値が使用されます。
bufsize と DECC$PIPE_BUFFER_SIZE のどちらも指定しなかった場合は,デフォルトのバッファ・サイズ 512 が使用されます。
bufquota
パイプのメールボックスのバッファ・クォータを指定する int型の引数 (オプション)。 512 〜 2147483647 の値を指定します。OpenVMS バージョン 7.3-2 で,この引数が追加されました。以前のバージョンの OpenVMS では,バッファ・クォータとバッファ・サイズは同じでした。
DECC$PIPE_BUFFER_QUOTA 機能論理名を使用しても,バッファ・クォータを指定できます。 pipe関数の bufquota オプション引数を指定すると, DECC$PIPE_BUFFER_QUOTA の値よりも優先されます。指定しないと,DECC$PIPE_BUFFER_QUOTA の値が使用されます。
bufquota と DECC$PIPE_BUFFER_QUOTA のどちらも指定しなかった場合,バッファ・クォータは以前と同じように,デフォルトでバッファ・サイズとなります。
パイプのために使われるメールボックスは,一時的なメールボックスです。メールボックスは,そのメールボックスに対するチャネルをオープンしているすべてのプロセスがそれらのチャネルをクローズするまでは削除されません。パイプを最後にクローズするプロセスは,メールボックスに対して,ファイルの終端を示すメッセージを書き込みます。メールボックスは,以下の特性を指定して,$CREMBX システム・サービスを使って作成されます。
- 最大メッセージ長は 512 文字
- バッファ・クォータは 512 文字
- USER および GROUP にすべての特権を与え, SYSTEM または WORLD には何の特権も与えない保護マスク
512 文字のバッファ・クォータは,メールボックスの全体または一部の読み込みを行うまで,メールボックスに 512 文字以上の書き込みを行えないということを意味しています。メールボックス・レコードは,それが含んでいるメッセージのデータ部よりも若干大きいので, 512 文字すべてをメッセージ・データに使用できるわけではありません。バッファのサイズは, pipe関数のオプションの第 3 引数によって代替サイズを指定することで増やすことができます。 OpenVMS システムにおけるパイプは,キャリッジ・コントロール属性を持たないストリーム型のファイルです。 HP C RTL では,これはデフォルトで完全にバッファリングされます。パイプとして使用されるメールボックスは,アプリケーションによって作成されるメールボックスとは異なります。アプリケーションによって作成されるメールボックスは,デフォルトでは,キャリッジ・リターンとキャリッジ・コントロールを含むレコード型のファイルになります。さらに,メールボックスに長さゼロのレコードを書き込んだときと,メールボックスがクローズされるたびに,EOF が書き込まれます。一方,パイプでは,パイプの最後のクローズのみが EOF を書き込みます。
パイプは, vforkと exec関数が呼び出される前に,親プロセスによって作成されます。子プロセスは,まず pipeを呼び出すことで,パイプのオープン・ファイル記述子を継承します。その後, getname関数を使って,必要ならばパイプに関連付けられているメールボックスの名前を返すことができます。 getnameから返されるメールボックス名は, nnnn を一意の数として,_MBAnnnn: の形式を持っています。
親と子の両方が,パイプに対してどのファイル記述子が割り当てられるのかを事前に知る必要があります。この情報は実行時に取得することはできません。このため, HP C for OpenVMS プログラムにおいてファイル記述子がどのように使われるかを理解しておくことが重要となります。ファイル記述子の詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 2 章を参照してください。
ファイル記述子 0,1,および 2 は, HP C for OpenVMS プログラムでは,それぞれ stdin(SYS$INPUT), stdout(SYS$OUTPUT), および stderr(SYS$ERROR) に対してオープンされています。このため, pipeが呼び出されたときに他のファイルがオープンされていない場合, pipeはファイル記述子 3 を書き込み用に,ファイル記述子 4 を読み込み用に割り当てます。 pipeから返される配列では,要素 0 に 4 が,要素 1 に 3 が格納されます。
他のファイルがオープンされている場合, pipeは最初の利用可能なファイル記述子を書き込み用に,次の利用可能なファイル記述子を読み込み用に割り当てます。この例では,パイプは必ずしも隣接するファイル記述子を使用しません。たとえば,2 つのファイルがオープンされ,ファイル記述子 3 と 4 が割り当てられた後に,前者のファイルがクローズされたとします。この時点で pipeが呼び出されると,ファイル記述子 3 が書き込み用に,ファイル記述子 5 が読み込み用に割り当てられます。配列の要素 0 には 5 が,要素 1 には 3 が格納されます。
大量の I/O を行う大きなアプリケーションでは,パイプにどのファイル記述子が割り当てられるかを予測するのがさらに困難になります。しかし,子プロセスは,どのファイル記述子が使われるかを知っていないと,パイプの読み書きを正しく行うことができません。
正しいファイル記述子が使われるようにするには,次の手順を使用する方法があります。
- 親と子の両方が知っている 2 つの記述子番号を選択する。これらの番号は,パイプが作成される前に行われる I/O を考慮に入れて,十分に大きな値でなくてはならない。
- 親プロセスの中で, exec関数を呼び出す前のいずれかの時点で pipeを呼び出す。
- 親プロセスの中で, dup2を使用して, pipeから返されたファイル記述子を,上で選んだファイル記述子に割り当てる。これにより,これらのファイル記述子がパイプ用に予約される。それ以降の I/O は,パイプと干渉することはない。
UNIX I/O 関数の readと writeを使用し,適切なファイル記述子を指定することで,パイプを通しての読み書きを行うことができます。別の方法として, fdopen呼び出しを発行して,これらのファイル記述子にファイル・ポインタを関連付ければ,標準 I/O 関数 ( freadと fwrite) を使用できるようになります。
パイプの読み込みと書き込みには 2 つの異なるファイル記述子が使用されますが,使用されるメールボックスは 1 つだけなので,何らかの I/O の同期化が必要となります。たとえば,親プロセスがパイプにメッセージを書き込んだとします。親プロセスがパイプから読み込みを行う最初のプロセスだった場合には, 図 REF-1 に示すように,自分のメッセージを読み戻すことになります。
図 REF-1 パイプの読み込みと書き込み
0 成功を示します。 - 1 エラーを示します。
プロセスに対するパイプを開始します。
#include <stdio.h>FILE *popen (const char *command, const char *type);
command
シェル・コマンド行を含んでいる,null で終わる文字列へのポインタ。type
I/O モードを含んでいる,null で終わる文字列へのポインタ。オープン・ファイルは共用されるので, type rコマンドを入力フィルタとして, type wコマンドを出力フィルタとして使用することができます。 type 引数としては,以下のいずれかの値を使用します。
- r---呼び出し元プログラムは,返されたファイル・ストリームから読み込みを行うことで,コマンドの標準出力から読み込みを行うことができる。
- w---呼び出し元プログラムは,返されたファイル・ストリームに書き込みを行うことで,コマンドの標準入力に書き込みを行うことができる。
popen関数は,呼び出し元プログラムと,実行を待っているシェル・コマンドの間にパイプを作成します。関数はストリームのための FILE構造体へのポインタを返します。popen関数は, DECC$PIPE_BUFFER_SIZE 機能論理名の値を使用して,パイプ用に作成するメールボックスのバッファ・サイズを設定します。 DECC$PIPE_BUFFER_SIZE の値には,512 〜 65024 バイトを指定できます。 DECC$PIPE_BUFFER_SIZE が指定されていない場合,デフォルトのバッファ・サイズ 512 が使用されます。
注意
popen関数を使って出力フィルタを呼び出す場合には,出力データがプログラム・バッファに残るために生じるデッドロックの可能性に注意するようにしてください。これは, setvbuf関数を使って出力ストリームがバッファリングされないようにするか, fflush関数を使って, pclose関数を呼び出す前にすべてのバッファリングされたデータをフラッシュさせることによって避けることができます。
fflush, pclose, および setvbufも参照してください。
x オープンされたストリームのための FILE 構造体へのポインタ。 NULL エラーを示します。ファイルまたはプロセスを作成することができませんでした。
前へ | 次へ | 目次 | 索引 |