popen

Autres langues

Langue: ja

Version: 1998-05-07 (mandriva - 01/05/08)

Section: 3 (Bibliothèques de fonctions)

名前

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 引き数は、NULL 終端さらた文字列へのポインタで、 読み込みの場合には `r'、書き込みの場合には `w' を指定する。 これ以外は指定できない。

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

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

pclose() 関数は、(パイプに) 関連づけられたプロセスが終了するのを待ち、 wait4(2) によって返されたコマンドの終了状態を返す。

返り値

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

pclose() 関数は、 wait4(2) がエラーを返したり、何か他のエラーが見つかった場合、 -1 を返す。

エラー

popen() 関数は、メモリアロケーションに失敗しても errno をセットしない。 popen() が中で呼び出す fork(2) や pipe(2) が失敗した場合には、 errno が適切にセットされる。 引き数 type が無効であり、この状態が検知された場合には、 errnoEINVAL にセットされる。

pclose() が、子プロセスの状態を取得できなかった場合、 errnoECHILD にセットされる。

準拠

POSIX.1-2001.

バグ

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

シェルの実行の失敗は、 シェルがコマンドの実行に失敗したことや、 コマンドがすぐに終了してしまったことと、区別がつかない。 唯一のヒントは終了状態が 127 になることである。

関連項目

sh(1), fork(2), pipe(2), wait4(2), fclose(3), fflush(3), fopen(3), stdio(3), system(3)