#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
command 引き数は、シェルのコマンドラインを含む NULL 終端された文字列へのポインタである。 このコマンドは -c フラグを用いて /bin/sh に渡される。 コマンドの解釈は (もし必要ならば) シェルによって行われる。 type 引き数は、NULL 終端された文字列へのポインタで、 読み込みを示す文字 aqraq か、書き込みを示す文字 aqwaq の どちらか一方を指定しなければならない。 glibc 2.9 以降では、この引き数に文字 aqeaq を追加で指定できる。 文字 aqeaq を指定すると、 対応するファイルディスクリプタにおいて、 close-on-exec フラグ (FD_CLOEXEC) がセットされる。 これが役に立つ理由については、 open(2) の O_CLOEXEC フラグの説明を参照のこと。
popen() からの返り値は、通常の標準 I/O ストリームと同じであるが、 fclose(3) ではなく pclose() で閉じなくてはならないことだけが異なる。 このストリームへ書き込んだ結果はコマンドの標準入力に書き込まれる。 そして、コマンドの標準出力は、 コマンドそのものが置き換わってしまわない限り、 popen() を呼んだプロセスの標準出力と同じことになる。 逆に、"popened" (popen() によって開かれた) ストリームからの読み込みは、 そのコマンドの標準出力を読み込むことになる。 そして、そのコマンドの標準入力は popen() を呼んだプロセスの標準入力と同一である。
デフォルトでは、 popen() の出力ストリームは完全にバッファリングされることに注意しよう。
pclose() 関数は、(パイプに) 関連づけられたプロセスが終了するのを待ち、 wait4(2) によって返されたコマンドの終了状態を返す。
pclose() 関数は、 wait4(2) がエラーを返したり、何か他のエラーが見つかった場合、 -1 を返す。
pclose() が、子プロセスの状態を取得できなかった場合、 errno が ECHILD にセットされる。
type に指定できる aqeaq は Linux での拡張である。
シェルの実行の失敗は、 シェルがコマンドの実行に失敗したことや、 コマンドがすぐに終了してしまったことと、区別がつかない。 唯一のヒントは終了状態が 127 になることである。