EN JA
POPEN(3)
POPEN(3) FreeBSD Library Functions Manual POPEN(3)

名称

popen, pcloseI/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 の終了ステータスです。

popen() 関数は、常に sh(1) を呼び出し、決して csh(1) を呼び出しません。

May 20, 2013 FreeBSD