POPEN
Section: Linux Programmer's Manual (3)
Updated: 1998-05-07
Index
JM Home Page
roff page
名前
popen, pclose - プロセス I/O
書式
#include <stdio.h>
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
説明
popen()
関数は、プロセスをオープンする。具体的には、
パイプを生成し、フォークを行い、シェルを起動する。
定義から分かるように、パイプは一方向なので、
type
引き数には読み込みか書き込みのどちらか一方だけを指定できる
(両方は指定できない)。
生成されるストリームは、この指定に対応して、読み取り専用または
書き込み専用のいずれかとなる。
command
引き数は、シェルのコマンドラインを含む
NULL 終端された文字列へのポインタである。
このコマンドは
-c
フラグを用いて
/bin/sh
に渡される。
コマンドの解釈は (もし必要ならば) シェルによって行われる。
type
引き数は、NULL 終端さらた文字列へのポインタで、
読み込みの場合には "r"、書き込みの場合には "w" を指定する。
これ以外は指定できない。
popen()
からの返り値は、通常の標準 I/O ストリームと同じであるが、
fclose(3)
ではなく
pclose()
で閉じなくてはならないことだけが異なる。
このストリームへ書き込んだ結果はコマンドの標準入力に書き込まれる。
そして、コマンドの標準出力は、
コマンドそのものが置き換わってしまわない限り、
popen()
を呼んだプロセスの標準出力と同じことになる。
逆に、``popened''
(popen()
によって開かれた) ストリームからの読み込みは、
そのコマンドの標準出力を読み込むことになる。
そして、そのコマンドの標準入力は
popen()
を呼んだプロセスの標準入力と同一である。
デフォルトでは、
popen()
の出力ストリームは完全にバッファリングされることに注意しよう。
pclose()
関数は、(パイプに) 関連づけられたプロセスが終了するのを待ち、
wait4(2)
によって返されたコマンドの終了状態を返す。
返り値
popen()
関数は、
fork(2)
または
pipe(2)
呼び出しが失敗した場合や、
メモリ割り当てができなかった場合、 NULL を返す。
pclose()
関数は、
wait4(2)
がエラーを返したり、何か他のエラーが見つかった場合、
-1 を返す。
エラー
popen()
関数は、メモリアロケーションに失敗しても
errno
をセットしない。
popen()
が中で呼び出す
fork(2)
や
pipe(2)
が失敗した場合には、
errno
が適切にセットされる。
引き数
type
が無効であり、この状態が検知された場合には、
errno
が
EINVAL
にセットされる。
pclose()
が、子プロセスの状態を取得できなかった場合、
errno
が
ECHILD
にセットされる。
準拠
POSIX.1-2001.
バグ
読み込みのために開かれたコマンドの標準入力は
popen(),
を呼んだプロセスと一緒に、その読み取り位置を共有する。
そのため、もとのプロセスがバッファリングされた読み取りを終了したら、
そのコマンドの入力位置は予想されたものには
なっていないかもしれない。
同様に、書き込みのために開かれたコマンドからの出力は、
もとのプロセスの出力と混ざり合うことになるかもしれない。
後者は
popen()
の前に
fflush(3)
を呼び出すことによって回避可能である。
シェルの実行の失敗は、
シェルがコマンドの実行に失敗したことや、
コマンドがすぐに終了してしまったことと、区別がつかない。
唯一のヒントは終了状態が 127 になることである。
関連項目
sh(1),
fork(2),
pipe(2),
wait4(2),
fclose(3),
fflush(3),
fopen(3),
stdio(3),
system(3)
Index
- 名前
-
- 書式
-
- 説明
-
- 返り値
-
- エラー
-
- 準拠
-
- バグ
-
- 関連項目
-
This document was created by
man2html,
using the manual pages.
Time: 04:31:55 GMT, November 19, 2007