POPEN(3) | FreeBSD Library Functions Manual | POPEN(3) |
名称
popen, pclose — I/O (入出力) 処理ライブラリ
Standard C Library (libc, -lc)書式
#include < stdio.h> FILE *
popen( const char *command, const char *type);
int
pclose( FILE *stream);
解説
popen() 関数は、双方向パイプを作成し、フォーク (fork) し、シェルを呼び出すことによってプロセスを“オープン”します。親プロセスの以前の popen() 呼び出しによってオープンされたあらゆるストリームは、新しい子プロセスでクローズされます。歴史的に popen() は、一方向のパイプで実装されていました。従って、 popen() の多くの実装によって、 type 引数は、両方でなく、読み込みまたは書み込みのを指定することができます。 popen() は、現在、双方向パイプを使用して実装されているので、 type 引数は、双方向のデータフローを要求します。 type 引数は、読み込みのためには、‘r
’、書き込みのためには、‘
w
’、読み込みと書き込みのためには、‘
r+
’でなければならない、ヌル文字で終了する文字列へのポインタです。
文字‘ e
’は、close-on-exec に設定されている基本的なファイル記述子を要求するために、それに追加されます。
command 引数は、シェルコマンドラインを含む、ヌル文字で終了する文字列のポインタです。このコマンドは、 -c フラグを使用して /bin/sh に渡されます。解釈があれば、シェルで実行されます。
popen() の戻り値はあらゆる点で通常の標準 I/O ストリームです。それは fclose() ではなく pclose() でクローズしなければならないために保存されます。そのようなストリームに書き込めば、コマンドの標準入力に書き込まれます。コマンドの標準出力は、そのコマンド自体で変更しないかぎり、 popen() で呼び出したプロセスのものと同じです。反対に、“popen でオープンされた”ストリームからの読み込みは、コマンドの標準出力を読み込みます。コマンドの標準入力は popen() を呼び出したプロセスのものと同じです。
出力 popen() ストリームは、デフォルトで完全にバッファされることに注意してください。
pclose() 関数は、関連するプロセスが終了するのを待ち、 wait4(2) で戻されるコマンドの終了ステータスを返します。
戻り値
popen() 関数は、 fork(2) または pipe(2) の呼び出しが失敗するか、またはメモリを割り付けられない場合 NULL を返します。pclose() 関数は、 stream が“popen でオープンされた”コマンドと関連していないか、 stream がすでに“pclose でクローズ”されているか、 wait4(2) がエラー返した場合は-1 を返します。
エラー
popen() 関数は、 errno の設定に信頼性がありません。歴史
popen() と pclose() 関数は、 Version 7 AT&T UNIX で登場しました。双方向の機能は、 FreeBSD 2.2.6 で追加されました。
バグ
読み込みのためにオープンしたコマンドの標準入力は、 popen() を呼び出したプロセスとシークオフセットを共有するので、オリジナルプロセスがバッファを使った読み込みが行われると、コマンドの入力位置が予想どおりではないかもしれません。同様に、書き込みのためにオープンしたコマンドの出力は、オリジナルプロセスのものと混合されるかもしれません。後者は、 popen() の前に fflush(3) を呼び出すことで回避できます。シェルの実行での失敗は、コマンドを実行するシェルの失敗、またはすぐに終了するコマンドと区別できません。唯一のヒントは、127 の終了ステータスです。
May 20, 2013 | FreeBSD |