Manpages

名 前

popen, pclose − プ ロ セ ス と の 入 力 /出 力 用 の パ イ プ ス ト リ ー ム

書 式

#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

説 明

popen() 関 数 は 、 プ ロ セ ス を オ ー プ ン す る 。 具 体 的 に は 、 パ イ プ を 生 成 し 、 フ ォ ー ク を 行 い 、 シ ェ ル を 起 動 す る 。 定 義 か ら 分 か る よ う に 、 パ イ プ は 一 方 向 な の で 、 type 引 き 数 に は 読 み 込 み か 書 き 込 み の ど ち ら か 一 方 だ け を 指 定 で き る (両 方 は 指 定 で き な い )。 生 成 さ れ る ス ト リ ー ム は 、 こ の 指 定 に 対 応 し て 、 読 み 取 り 専 用 ま た は 書 き 込 み 専 用 の い ず れ か と な る 。

command 引 き 数 は 、 シ ェ ル の コ マ ン ド ラ イ ン を 含 む ヌ ル 終 端 さ れ た 文 字 列 へ の ポ イ ン タ ー で あ る 。 こ の コ マ ン ド は −c フ ラ グ を 用 い て /bin/sh に 渡 さ れ る 。 コ マ ン ド の 解 釈 は (も し 必 要 な ら ば ) シ ェ ル に よ っ て 行 わ れ る 。 type 引 き 数 は 、 ヌ ル 終 端 さ れ た 文 字 列 へ の ポ イ ン タ ー で 、 読 み 込 み を 示 す 文 字 'r' か 、 書 き 込 み を 示 す 文 字 'w' の ど ち ら か 一 方 を 指 定 し な け れ ば な ら な い 。 glibc 2.9 以 降 で は 、 こ の 引 き 数 に 文 字 'e' を 追 加 で 指 定 で き る 。 文 字 'e' を 指 定 す る と 、 対 応 す る フ ァ イ ル デ ィ ス ク リ プ タ ー に お い て 、 close−on−exec フ ラ グ (FD_CLOEXEC) が セ ッ ト さ れ る 。 こ れ が 役 に 立 つ 理 由 に つ い て は 、 open(2)O_CLOEXEC フ ラ グ の 説 明 を 参 照 の こ と 。

popen() か ら の 返 り 値 は 、 通 常 の 標 準 I/O ス ト リ ー ム と 同 じ で あ る が 、 fclose(3) で は な く pclose() で 閉 じ な く て は な ら な い こ と だ け が 異 な る 。 こ の ス ト リ ー ム へ 書 き 込 ん だ 結 果 は コ マ ン ド の 標 準 入 力 に 書 き 込 ま れ る 。 そ し て 、 コ マ ン ド の 標 準 出 力 は 、 コ マ ン ド そ の も の が 置 き 換 わ っ て し ま わ な い 限 り 、 popen() を 呼 ん だ プ ロ セ ス の 標 準 出 力 と 同 じ こ と に な る 。 逆 に 、 ス ト リ ー ム か ら の 読 み 込 み は 、 そ の コ マ ン ド の 標 準 出 力 を 読 み 込 む こ と に な る 。 そ し て 、 そ の コ マ ン ド の 標 準 入 力 は popen() を 呼 ん だ プ ロ セ ス の 標 準 入 力 と 同 一 で あ る 。 デ フ ォ ル ト で は 、 popen() の 出 力 ス ト リ ー ム は 完 全 に バ ッ フ ァ ー リ ン グ さ れ る こ と に 注 意 し よ う 。

pclose() 関 数 は 、 (パ イ プ に ) 関 連 づ け ら れ た プ ロ セ ス が 終 了 す る の を 待 ち 、 wait4(2) に よ っ て 返 さ れ た コ マ ン ド の 終 了 状 態 を 返 す 。

返 り 値

popen() 関 数 は 、 fork(2) ま た は pipe(2) 呼 び 出 し が 失 敗 し た 場 合 や 、 メ モ リ ー 割 り 当 て が で き な か っ た 場 合 、 NULL を 返 す 。

pclose() 関 数 は 、 wait4(2) が エ ラ ー を 返 し た り 、 何 か 他 の エ ラ ー が 見 つ か っ た 場 合 、 −1 を 返 す 。 そ の 場 合 、 errno に エ ラ ー の 原 因 を 示 す 値 が 設 定 さ れ る 。

エ ラ ー

popen() 関 数 は 、 メ モ リ ー ア ロ ケ ー シ ョ ン に 失 敗 し て も errno を セ ッ ト し な い 。 popen() が 中 で 呼 び 出 す fork(2)pipe(2) が 失 敗 し た 場 合 に は 、 errno が 適 切 に セ ッ ト さ れ る 。 引 き 数 type が 無 効 で あ り 、 こ の 状 態 が 検 知 さ れ た 場 合 に は 、 errnoEINVAL に セ ッ ト さ れ る 。

pclose() が 、 子 プ ロ セ ス の 状 態 を 取 得 で き な か っ た 場 合 、 errnoECHILD に セ ッ ト さ れ る 。

準 拠

POSIX.1−2001.

type に 指 定 で き る 'e' は Linux で の 拡 張 で あ る 。

バ グ

読 み 込 み の た め に 開 か れ た コ マ ン ド の 標 準 入 力 は popen(), を 呼 ん だ プ ロ セ ス と 一 緒 に 、 そ の 読 み 取 り 位 置 を 共 有 す る 。 そ の た め 、 も と の プ ロ セ ス が バ ッ フ ァ ー リ ン グ さ れ た 読 み 取 り を 終 了 し た ら 、 そ の コ マ ン ド の 入 力 位 置 は 予 想 さ れ た も の に は な っ て い な い か も し れ な い 。 同 様 に 、 書 き 込 み の た め に 開 か れ た コ マ ン ド か ら の 出 力 は 、 も と の プ ロ セ ス の 出 力 と 混 ざ り 合 う こ と に な る か も し れ な い 。 後 者 は popen() の 前 に fflush(3) を 呼 び 出 す こ と に よ っ て 回 避 可 能 で あ る 。 シ ェ ル の 実 行 の 失 敗 は 、 シ ェ ル が コ マ ン ド の 実 行 に 失 敗 し た こ と や 、 コ マ ン ド が す ぐ に 終 了 し て し ま っ た こ と と 、 区 別 が つ か な い 。 唯 一 の ヒ ン ト は 終 了 状 態 が 127 に な る こ と で あ る 。

関 連 項 目

sh(1), fork(2), pipe(2), wait4(2), fclose(3), fflush(3), fopen(3), stdio(3), system(3)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。