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