名称
popen(), pclose() ― プロセスへの、またはプロセスからのパイプ I/O の初期化
構文
#include <stdio.h>
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
説明
popen() は、呼び出しプログラムと POSIX
シェル、 /usr/bin/sh sh-posix(1) を参照) の間にパイプを作成します。
popen() の引き数は null で終わる文字列へのポインターで、一方はシェルコマンド行です。もう一方は I/O モードで、読み出しの時は r、
書き出しの時は w のどちらかです。
popen() はストリームポインターを返します。I/O モードが w の時はそのファイル stream に書き出すことでコマンドの標準入力に書き出せます。
I/O モードが r の時は、そのファイル stream から読み込むことでコマンドの標準出力から読み込めます。
popen() でオープンされたストリームをクローズするには pclose() を使います。この関数は関連したプロセスが終了するまで待ち、コマンドの終了状態を返します。
開いているファイルは共有されるので、 r 型のコマンドは入力フィルターとして、 w 型のコマンドは出力フィルターとして使えます。
アプリケーション使用法
ストリームが popen() によってパイプに関連づけられた後は、ストリームはバイト指向になります
(orientation(5) を参照)。
戻り値
popen() はファイルあるいはプロセスが作成できなかったときは
NULL ポインターを返します。 コマンドの実行が成功したかどうかは pclose() の戻り値を調べればわかります。
pclose() は、 stream が popen() されたコマンドと関係ないと -1 を返します。 /usr/bin/sh が何らかの理由により実行されなかったときは 127 を返します。
警告
本来のプロセスと popen() されたプロセスが同時に共通のファイルに読み書きする場合には、バッファリングは正しく機能しないので、どちらのプロセスからもバッファー I/O
は使ってはいけません。出力フィルターでの問題は fflush() などを使って、注意深くバッファーを掃き出すことで防げます。詳しくは fclose(3S) を参照してください。
標準準拠
popen(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, POSIX.2
pclose(): AES, SVID2, SVID3, XPG2, XPG3,
XPG4, POSIX.2