popen - ライブラリコールの説明 - Linux コマンド集 一覧表
名前
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' を指定する。 これ以外は指定できない。
popen ()からの返り値は、 fclose ()ではなく pclose ()で閉じなくてはならないことを除けば、 通常の標準 I/O ストリームと同じである。 このストリームへ書き込んだ結果はコマンドの標準入力に書き込まれる。 そして、コマンドの標準出力は、 コマンドそのものが置き換わってしまわない限り、 popen ()を呼んだプロセスの標準出力と同じことになる。 逆に、``popened'' ( popen ()によって開かれた) ストリームからの読み込みは、 そのコマンドの標準出力を読み込むことになる。 そして、そのコマンドの標準入力は popen ()を呼んだプロセスの標準入力と同一である。
デフォルトでは、 popen ()の出力ストリームは完全にバッファリングされることに注意しよう。
pclose ()関数は、(パイプに) 関連づけられたプロセスが終了するのを待ち、 wait4 ()によって返されたコマンドの終了状態を返す。
返り値
popen ()関数は、 もし fork (2) または pipe (2) 呼び出しが失敗した場合や、 メモリ割り付けができなかった場合には NULL を返す。
wait4 ()がエラーを返したり、何か他のエラーが見つかった場合には、 pclose ()関数は -1 を返す。
エラー
popen ()関数は、メモリアロケーションに失敗しても errno をセットしない。 popen ()の下にある fork ()や pipe ()が失敗した場合には、 errno が適切にセットされる。 引数 type が無効であり、この状態が検知された場合には、 errno が EINVAL にセットされる。
pclose ()が子プロセスを作成できなかった場合、 errno は ECHILD にセットされる。
準拠
POSIX.1-2001.
バグ
読み込みのために開かれたコマンドの標準入力は popen (),を呼んだプロセスと一緒に、その読み取り位置を共有する。 そのため、もとのプロセスがバッファリングされた読み取りを終了したら、 そのコマンドの入力位置は予想されたものには なっていないかもしれない。 同様に、書き込みのために開かれたコマンドからの出力は もとのプロセスの出力と混ざり合うことになるかもしれない。 後者は popen ()の前に fflush (3) を呼ぶことによって避けることが可能である。
シェルの実行の失敗は シェルがコマンドの実行に失敗したことや コマンドの緊急終了と区別がつかない。 唯一のヒントは 127 の終了状態である。
履歴
popen ()関数と pclose ()関数は AT&T UNIX の Version 7 から導入された。