POPEN(3)

名前
popen, pclose - プロセス I/O

書式
#include <stdio.h>

FILE *popen(const char *command, const char *type);

int pclose(FILE *stream);

説明
popen() 関数はパイプ、フォークそしてシェルの呼び出しを生成することに よってプロセスを開く。 定義上、パイプは方向性を持つので、 type 引数が読み取りまたは書き込みのどちらか一方(両方ではない)を 特定することになる。 結果としてできるストリームは、読み取りのみ可または 書き込みのみ可のいずれかに対応する。

command 引数はシェルのコマンドラインを含んだnullで終了している文字列 へのポインタである。 このコマンドは -c フラグを用いて /bin/sh に送られる。 コマンドの解釈は(もし必要ならば)このシェルによって行われる。 type 引数は、 読み込みの場合には`r'、書き込みの場合には`w'のいずれかでなければならない nullで終る文字列へのポインタである。

popen() からの返り値は、 fclose() ではなく pclose() で閉じなくてはならないことを除けば、 通常の標準I/Oストリームと同じである。 このストリームへ書き込んだ結果はコマンドの標準入力に書き込まれる。 そして、コマンドの標準出力は、 コマンドそのものが置き換わってしまわない限り、 popen() を呼んだプロセスの標準出力と同じことである。 逆に、``popened''(popen()によって開かれた)ストリームからの読み込みは、 そのコマンドの標準出力を読み込むことになる。 そして、そのコマンドの標準入力は popen を呼んだプロセスの標準入力と同一である。

デフォルトでは、 popen の出力ストリームは完全にバッファリングされることに注意しよう。

pclose 関数は、この関数の実行に伴って終了するプロセスを待ち、 wait4 によって返されたコマンドの終了状態を返す。

返り値
popen 関数は、 もし fork(2) または pipe(2) 呼び出しが失敗した場合や、 メモリ割り付けができなかった場合には NULL を返す。

stream が``popened''(popen()によって呼び出された)コマンドと連結されなかった場合、 stream が既に``pclosed''(pclose()関数を実行)している場合、そして wait4 がエラーを返した場合には、 pclose 関数は-1を返す。

エラー
popen 関数がセットする errno は信頼性が高くない(これはLinuxでも正しいの？)。

バグ
読み込みのために開かれたコマンドの標準入力は popen(), を呼んだプロセスと一緒に、その読み取り位置を共有する。 そのため、もとのプロセスがバッファリングされた読み取りを終了したら、 そのコマンドの入力位置は予想されたものには なっていないかもしれない。 同様に、書き込みのために開かれたコマンドからの出力は もとのプロセスの出力と混ざり合うことになるかもしれない。 後者は popen の前に fflush(3) を呼ぶことによって避けることが可能である。

シェルの実行の失敗は シェルがコマンドの実行に失敗したことや コマンドの緊急終了と区別がつかない。 唯一のヒントは 127の終了状態である。(これはLinux環境下でも正しいの？)

関数 popen() は常に sh, を呼び、 csh は呼ばない。

履歴
popen() 関数と pclose() 関数は AT&T UNIXのVersion 7から導入された。

関連項目
fork(2), sh(1), pipe(2), wait4(2), fflush(3), fclose(3), fopen(3), stdio(3), system(3).