Provided by: manpages-ja-dev_0.5.0.0.20180315+dfsg-1_all ![bug](/img/bug.png)
![bug](/img/bug.png)
名前
popen, pclose - プロセスとの入力/出力用のパイプストリーム
書式
#include <stdio.h> FILE *popen(const char *command, const char *type); int pclose(FILE *stream); glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照): popen(), pclose(): _POSIX_C_SOURCE >= 2 || _XOPEN_SOURCE || _BSD_SOURCE || _SVID_SOURCE
説明
popen() 関数は、プロセスをオープンする。具体的には、 パイプを生成し、フォークを行い、シェルを起動する。 定義から分かるように、パイプは一方向なので、 type 引き数には読み込みか書き込みのどちらか一方だけを指定で きる (両方は指定できない)。 生成されるストリームは、この指定に対応して、読み取り専用または 書き込み専用の いずれかとなる。 command 引き数は、シェルのコマンドラインを含むヌル終端された文字列へのポインターである。 このコマンドは -c フラグを用いて /bin/sh に渡される。 コマンドの解釈は (もし必要ならば) シェルによって行われる。 type 引 き数は、ヌル終端された文字列へのポインターで、 読み込みを示す文字 'r' か、書き込みを示す文字 'w' の どち らか一方を指定しなければならない。 glibc 2.9 以降では、この引き数に文字 'e' を追加で指定できる。 文字 'e' を指定すると、 対応するファイルディスクリプターにおいて、 close-on-exec フラグ (FD_CLOEXEC) がセットされ る。 これが役に立つ理由については、 open(2) の O_CLOEXEC フラグの説明を参照のこと。 popen() からの返り値は、通常の標準 I/O ストリームと同じであるが、 fclose(3) ではなく pclose() で閉じな くてはならないことだけが異なる。 このストリームへ書き込んだ結果はコマンドの標準入力に書き込まれる。 そし て、コマンドの標準出力は、 コマンドそのものが置き換わってしまわない限り、 popen() を呼んだプロセスの標準 出力と同じことになる。 逆に、 ストリームからの読み込みは、 そのコマンドの標準出力を読み込むことになる。 そして、そのコマンドの標準入力は popen() を呼んだプロセスの標準入力と同一である。 デフォルトでは、 popen() の出力ストリームは完全にバッファーリングされることに注意しよう。 pclose() 関数は、(パイプに) 関連づけられたプロセスが終了するのを待ち、 wait4(2) によって返されたコマンド の終了状態を返す。
返り値
popen() 関数は、 fork(2) または pipe(2) 呼び出しが失敗した場合や、 メモリー割り当てができなかった場 合、 NULL を返す。 pclose() 関数は、 wait4(2) がエラーを返したり、何か他のエラーが見つかった場合、 -1 を返す。 その場合、 errno にエラーの原因を示す値が設定される。
エラー
popen() 関数は、メモリーアロケーションに失敗しても errno をセットしない。 popen() が中で呼び出す fork(2) や pipe(2) が失敗した場合には、 errno が適切にセットされる。 引き数 type が無効であり、この状態 が検知された場合には、 errno が EINVAL にセットされる。 pclose() が、子プロセスの状態を取得できなかった場合、 errno が ECHILD にセットされる。
準拠
POSIX.1-2001. type に指定できる 'e' は Linux での拡張である。
バグ
読み込みのために開かれたコマンドの標準入力は popen(), を呼んだプロセスと一緒に、その読み取り位置を共有す る。 そのため、もとのプロセスがバッファーリングされた読み取りを終了したら、 そのコマンドの入力位置は予想 されたものには なっていないかもしれない。 同様に、書き込みのために開かれたコマンドからの出力は、 もとのプ ロセスの出力と混ざり合うことになるかもしれない。 後者は popen() の前に fflush(3) を呼び出すことによって 回避可能である。 シェルの実行の失敗は、 シェルがコマンドの実行に失敗したことや、 コマンドがすぐに終了してしまったこと と、区別がつかない。 唯一のヒントは終了状態が 127 になることである。
関連項目
sh(1), fork(2), pipe(2), wait4(2), fclose(3), fflush(3), fopen(3), stdio(3), system(3)
この文書について
この man ページは Linux man-pages プロジェクトのリリース 3.79 の一部 である。プロジェクトの説明とバグ報告 に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。