Manpages

名 前

vfork − 子 プ ロ セ ス を 生 成 し 親 プ ロ セ ス を 停 止 さ せ る

書 式

#include <sys/types.h>
#include <unistd.h>

pid_t vfork(void);

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):

vfork():

glibc 2.12 以 降 :

_BSD_SOURCE ||
(_XOPEN_SOURCE >= 500 ||
_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) &&
!(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700)

glibc 2.12 よ り 前 : _BSD_SOURCE || _XOPEN_SOURCE >= 500 ||
_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED

説 明

規 格 の 説 明

(POSIX.1 よ り 引 用 ) vfork() 関 数 は fork(2) と 同 じ 働 き を す る が 、 vfork() で 作 成 さ れ た プ ロ セ ス が vfork() か ら の 返 り 値 を 格 納 し て い る pid_t 型 の 変 数 以 外 を 変 更 し た り 、 vfork() を 呼 び 出 し て い る 関 数 か ら return し た り 、 _exit(2)exec(3) 族 の 関 数 を コ ー ル す る 前 に 他 の 関 数 を コ ー ル し た 場 合 の 動 作 が 未 定 義 で あ る と い う 点 が 異 な る 。

LINUX で の 説 明
vfork
() は fork(2) と 全 く 同 じ よ う に 呼 び 出 し た プ ロ セ ス の 子 プ ロ セ ス を 生 成 す る 。 詳 し い 説 明 と 返 り 値 、 エ ラ ー に つ い て は fork(2) を 参 照 す る こ と 。

vfork() は clone(2) の 特 殊 な 場 合 で あ る 。 親 プ ロ セ ス の ペ ー ジ テ ー ブ ル の コ ピ ー を 行 わ ず に 新 し い プ ロ セ ス を 作 成 す る た め に 使 用 す る 。 こ れ は 性 能 に 敏 感 な ア プ リ ケ ー シ ョ ン に お い て 子 プ ロ セ ス を 生 成 し て す ぐ に execve(2) す る 場 合 に 有 用 か も し れ な い 。

vfork() は fork(2) と 違 い 、 子 プ ロ セ ス が 終 了 す る か 、 execve(2) を コ ー ル す る ま で 呼 び 出 し 元 の ス レ ッ ド を 停 止 (suspend) さ せ る 。 子 プ ロ セ ス の 終 了 は 、 _exit(2) の 呼 び 出 し に よ る 通 常 終 了 、 致 命 的 な シ グ ナ ル の 配 送 後 の 異 常 終 了 の 二 つ の ケ ー ス が あ る 。 こ の 時 点 ま で は 、 子 プ ロ セ ス は ス タ ッ ク を 含 む 全 て の メ モ リ ー を 親 プ ロ セ ス と 共 有 す る 。 子 プ ロ セ ス は 現 在 の 関 数 か ら return し て は な ら ず 、 exit(3) も コ ー ル し て は な ら な い が 、 _exit(2) な ら ば コ ー ル し て も よ い 。

fork(2) と 同 様 に 、 vfork() で 作 成 さ れ た 子 プ ロ セ ス は 、 (フ ァ イ ル デ ィ ス ク リ プ タ ー 、 シ グ ナ ル 配 送 定 義 、 カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ な ど の ) 呼 び 出 し 元 の プ ロ セ ス の 各 種 の 属 性 を 継 承 す る 。 vfork() で は 、 上 で 説 明 し た 仮 想 ア ド レ ス 空 間 の 扱 い だ け が 異 な る 。 親 プ ロ セ ス へ 送 ら れ た シ グ ナ ル は 、 子 プ ロ セ ス が 親 プ ロ セ ス の メ モ リ ー を 解 放 し た 後 (す な わ ち 、 子 プ ロ セ ス が 終 了 す る か execve(2) を 呼 ん だ 後 ) に 到 着 す る 。 歴 史 的 な 説 明
Linux に お い て fork(2) は 書 き 込 み 時 コ ピ ー (copy−on−write) ペ ー ジ を 使 用 し て 実 装 さ れ て い る 。 そ の た め fork(2) を 使 用 す る こ と に よ っ て 被 る 損 害 は 親 プ ロ セ ス の ペ ー ジ テ ー ブ ル を 複 製 す る た め に 必 要 な 時 間 と メ モ リ ー だ け で あ る 。 し か し な が ら 、 忌 し き 昔 に は fork(2) は 呼 び 出 し た プ ロ セ ス の デ ー タ 空 間 の 全 て の コ ピ ー し て い た が 、 こ れ は し ば し ば 不 必 要 で あ っ た 。 な ぜ な ら 、 た い て い は す ぐ 後 に exec(3) を 実 行 し て い た か ら で あ る 。 こ の 場 合 の 効 率 を 上 げ る た め に BSD は vfork() シ ス テ ム コ ー ル を 導 入 し て 親 プ ロ セ ス の ア ド レ ス 空 間 を 完 全 に コ ピ ー す る か わ り に 、 execve(2) を コ ー ル す る か exit が 起 き る ま で 親 プ ロ セ ス の メ モ リ ー と 制 御 ス レ ッ ド を 借 り る よ う に し た 。 親 プ ロ セ ス は 子 プ ロ セ ス が そ の 資 源 を 使 用 し て い る 間 は 停 止 さ れ た 。 vfork() は 使 い に く い も の で あ っ た : 例 え ば 、 親 プ ロ セ ス の 変 数 を 変 更 し な い よ う に す る た め に は ど の 変 数 が レ ジ ス タ ー に 保 持 さ れ て い る か を 知 ら な け れ ば な ら な か っ た 。

準 拠

4.3BSD; POSIX.1−2001 (廃 止 予 定 と さ れ て い る )。 POSIX.1−2008 で は vfork() の 規 定 が 削 除 さ れ て い る 。

vfork() コ ー ル は 他 の オ ペ レ ー テ ィ ン グ シ ス テ ム の 同 名 の コ ー ル と ち ょ っ と 似 て い る か も し れ な い 。 規 格 が vfork() に 要 求 し て い る こ と は 、 fork(2) に 要 求 し て い る こ と よ り は 弱 い 。 し た が っ て 、 両 者 を 同 じ も の と し て 実 装 し て も 、 規 格 に 準 拠 し て い る こ と に な る 。 特 に プ ロ グ ラ マ ー は 、 子 プ ロ セ ス が 終 了 す る か execve(2) を 呼 び 出 す ま で 親 プ ロ セ ス が 停 止 し て い る こ と や 、 メ モ リ ー を 共 有 す る こ と に よ る 特 殊 な 動 作 を あ て に す べ き で は な い 。

注 意

vfork() の 動 作 は 構 造 的 な 欠 陥 と 考 え る 人 も い る だ ろ う し 、 BSD の マ ニ ュ ア ル に は 、 「 こ の シ ス テ ム コ ー ル は 妥 当 な シ ス テ ム 共 有 機 構 が 実 装 さ れ た 場 合 に は 削 除 さ れ る 。 ユ ー ザ ー は vfork() の メ モ リ ー 共 有 機 能 に 依 存 す る べ き で は な い 。 何 故 な ら ば 、 こ の シ ス テ ム コ ー ル が 削 除 さ れ た 場 合 に は 、 そ れ は fork(2) の 同 義 語 と さ れ る か ら で あ る 。 」 と 書 か れ て い る 。 し か し な が ら 、 最 近 の メ モ リ ー 管 理 ハ ー ド ウ ェ ア に よ り fork(2)vfork() の 間 の 性 能 差 が 減 っ た と は い え 、 Linux や 他 の シ ス テ ム で vfork() が 残 さ れ て い る の に は い く つ か 理 由 が あ る :

* 性 能 に 厳 し い ア プ リ ケ ー シ ョ ン で は 、

vfork() に よ り 得 ら れ る 小 さ な 性 能

上 の メ リ ッ ト が 必 要 な 場 合 が あ る 。

*

vfork() は メ モ リ ー 管 理 ユ ニ ッ ト (MMU) を 持 た な い シ ス テ ム で も 実 装 す る こ と が で き る が 、 そ の よ う な シ ス テ ム で fork(2) を 実 装 す る こ と は で き な い 。 (POSIX.1−2008 で は vfork() が 標 準 か ら 削 除 さ れ た 。 posix_spawn(3) 関 数 の POSIX の 原 理 (rationale) に は 、 fork(2)+exec(3) と 等 価 な 機 能 を 提 供 す る posix_spawn(3) は 、 MMU を 持 た な い シ ス テ ム で も 実 装 で き る よ う に 設 計 さ れ た と の 注 記 が あ る 。 )

Linux で の 注 意
pthread_atfork(3) を 使 っ て 設 定 さ れ た fork ハ ン ド ラ ー は NPTL ス レ ッ ド ラ イ ブ ラ リ コ ー ル を 採 用 し た マ ル チ ス レ ッ ド プ ロ グ ラ ム で は 呼 び 出 さ れ な い 。 一 方 、 LinuxThreads ス レ ッ ド ラ イ ブ ラ リ を 使 っ た プ ロ グ ラ ム で は 、 fork ハ ン ド ラ ー は 呼 び 出 さ れ る 。 (Linux の ス レ ッ ド ラ イ ブ ラ リ の 説 明 は pthreads(7) を 参 照 。 )

vfork() の 呼 び 出 し は 、 以 下 の flags を 指 定 し て clone(2) を 呼 び 出 す の と 等 価 で あ る 。

CLONE_VM | CLONE_VFORK | SIGCHLD 歴 史
vfork
() シ ス テ ム コ ー ル は 3.0BSD に 現 わ れ た 。 4.4BSD に お い て fork(2) の 同 義 語 と な っ た が 、 NetBSD で は 再 び 導 入 さ れ た 。 http://www.netbsd.org/Documentation/kernel/vfork.html">http://www.netbsd.org/Documentation/kernel/vfork.html を 参 照 。 Linux で は 2.2.0−pre6 あ た り ま で は fork(2) と 等 価 で あ っ た 。 (i386 で は ) 2.2.0−pre9 か ら (他 の ア ー キ テ ク チ ャ ー で は 少 し 遅 れ て ) 独 立 し た シ ス テ ム コ ー ル と な っ た 。 glibc で の サ ポ ー ト は glibc−2.0.112 で 追 加 さ れ た 。

バ グ

シ グ ナ ル の 扱 い の 詳 細 は 不 明 瞭 で シ ス テ ム ご と に 異 っ て い る 。 BSD の マ ニ ュ ア ル に は 、 「 デ ッ ド ロ ッ ク 状 態 に な る 可 能 性 が あ る の で vfork() の 途 中 の 子 プ ロ セ ス に SIGTTOUSIGTTIN シ グ ナ ル を 送 信 し て は な ら な い ; さ ら に 出 力 や ioctl は 許 さ れ る が 、 入 力 を 試 み た 場 合 に は 結 果 は フ ァ イ ル 終 端 (EOF) に な る 。 」 と 書 か れ て い る 。

関 連 項 目

clone(2), execve(2), fork(2), unshare(2), wait(2)

こ の 文 書 に つ い て

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