Manpages

名 前

fork − 子 プ ロ セ ス を 生 成 す る

書 式

#include <unistd.h>

pid_t fork(void);

説 明

fork() は 呼 び 出 し 元 プ ロ セ ス を 複 製 し て 新 し い プ ロ セ ス を 生 成 す る 。 child で 参 照 さ れ る 新 し い プ ロ セ ス は 、 以 下 の 点 を 除 き 、 parent で 参 照 さ れ る 呼 び 出 し 元 プ ロ セ ス の 完 全 な 複 製 で あ る :

* 子 プ ロ セ ス は 独 自 の プ ロ セ ス

ID を 持 ち 、 こ の PID は 既 存 の ど の プ ロ セ ス

グ ル ー プ (setpgid(2)) の ID と も 一 致 し な い 。

* 子 プ ロ セ ス の 親 プ ロ セ ス

ID は 、 親 プ ロ セ ス の プ ロ セ ス ID と 同 じ で あ る 。

* 子 プ ロ セ ス は 親 プ ロ セ ス の

メ モ リ ー ロ ッ ク (mlock(2), mlockall(2)) を 引 き 継 が な い 。

*

プ ロ セ ス の 資 源 利 用 量 (getrusage(2)) と CPU タ イ ム カ ウ ン タ ー (times(2)) が 、 子 プ ロ セ ス で は 0 に リ セ ッ ト さ れ る 。

*

子 プ ロ セ ス の 処 理 待 ち の シ グ ナ ル の 集 合 (sigpending(2)) は 、 初 期 状 態 で は 空 に な る 。

*

子 プ ロ セ ス は 親 プ ロ セ ス か ら セ マ フ ォ 調 整 (semop(2)) を 引 き 継 が な い 。

* 子 プ ロ セ ス は 親 プ ロ セ ス か ら プ ロ セ ス に 関 連

付 け ら れ た レ コ ー ド ロ ッ ク を 引 き 継 が な い (fcntl(2))。 (一 方 、 子 プ ロ セ ス は 親 プ ロ セ ス か ら fcntl(2) オ ー プ ン フ ァ イ ル 記 述 ロ ッ ク と flock(2) ロ ッ ク を 引 き 継 ぐ 。 )

*

子 プ ロ セ ス は 親 プ ロ セ ス か ら タ イ マ ー (setitimer(2), alarm(2), timer_create(2)) を 引 き 継 が な い 。

*

子 プ ロ セ ス は 親 プ ロ セ ス か ら 主 だ っ た 非 同 期 I/O 操 作 を 引 き 継 が な い (aio_read(3), aio_write(3) 参 照 )。 ま た 、 親 プ ロ セ ス か ら 非 同 期 I/O コ ン テ キ ス ト を 引 き 継 が な い (io_setup(2) 参 照 )。 上 記 の リ ス ト に あ る プ ロ セ ス 属 性 は 、 POSIX.1−2001 で 全 て 指 定 さ れ て い る 。 親 プ ロ セ ス と 子 プ ロ セ ス は 、 以 下 の Linux 固 有 の プ ロ セ ス 属 性 も 異 な る :

* 子 プ ロ セ ス は 親 プ ロ セ ス か ら デ ィ レ ク ト リ 変 更 通 知

(dnotify) (fcntl(2) に お け る F_NOTIFY の 説 明 を 参 照 ) を 引 き 継 が な い 。

*

prctl(2)PR_SET_PDEATHSIG の 設 定 が リ セ ッ ト さ れ 、 子 プ ロ セ ス は 親 プ ロ セ ス が 終 了 し た と き に シ グ ナ ル を 受 信 し な い 。

*

timer slack value の デ フ ォ ル ト 値 に は 、 親 プ ロ セ ス の 現 在 の timer slack value が 設 定 さ れ る 。 prctl(2)PR_SET_TIMERSLACK の 説 明 を 参 照 。

*

madvise(2)MADV_DONTFORK フ ラ グ で マ ー ク さ れ た メ モ リ ー マ ッ ピ ン グ は 、 fork() に よ っ て 引 き 継 が れ な い 。

*

子 プ ロ セ ス の 終 了 シ グ ナ ル は 常 に SIGCHLD で あ る (clone(2) を 参 照 )。
*

ioperm(2) で 設 定 さ れ る ポ ー ト ア ク セ ス 許 可 ビ ッ ト は 、 子 プ ロ セ ス に は 継 承 さ れ な い 。 子 プ ロ セ ス で は 、 ioperm(2) を 使 っ て 必 要 な ビ ッ ト を セ ッ ト し な け れ ば な ら な い 。

以 下 の 点 に つ い て も 注 意 す る こ と :

* 子 プ ロ セ ス は シ ン グ ル ス レ ッ ド で 生 成 さ れ る 。 つ ま り 、

fork() を 呼 び 出

し た ス レ ッ ド と な る 。 親 プ ロ セ ス の 仮 想 ア ド レ ス 空 間 全 体 が 子 プ ロ セ ス に 複 製 さ れ る 。 こ れ に は ミ ュ ー テ ッ ク ス (mutex) の 状 態 ・ 条 件 変 数 ・ pthread オ ブ ジ ェ ク ト が 含 ま れ る 。 こ れ が 引 き 起 こ す 問 題 を 扱 う に は 、 pthread_atfork(3) を 使 う と 良 い だ ろ う 。

* 子 プ ロ セ ス は 親 プ ロ セ ス が 持 つ オ ー プ ン フ ァ イ ル デ ィ ス ク リ プ タ ー の 集 合 の コ ピ ー を 引 き 継 ぐ 。 子 プ ロ セ ス の 各 フ ァ イ ル デ ィ ス ク リ プ タ ー は 、 親 プ ロ セ ス の フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 応 す る 同 じ オ ー プ ン フ ァ イ ル 記 述

(file description) を 参 照 す る (open(2) を 参 照 )。 こ れ は 2 つ の デ ィ ス ク リ プ タ ー が 、 フ ァ イ ル 状 態 フ ラ グ ・ 現 在 の フ ァ イ ル オ フ セ ッ ト 、 シ グ ナ ル 駆 動 (signal−driven) I/O 属 性 (fcntl(2) に お け る F_SETOWN, F_SETSIG の 説 明 を 参 照 ) を 共 有 す る こ と を 意 味 す る 。

* 子 プ ロ セ ス は 親 プ ロ セ ス が 持 つ オ ー プ ン メ ッ セ ー ジ キ ュ ー デ ィ ス ク リ プ タ ー

(mq_overview(7) を 参 照 ) の 集 合 の コ ピ ー を 引 き 継 ぐ 。 子 プ ロ セ ス の 各 デ ィ ス ク リ プ タ ー は 、 親 プ ロ セ ス の デ ィ ス ク リ プ タ ー に 対 応 す る 同 じ オ ー プ ン メ ッ セ ー ジ キ ュ ー デ ィ ス ク リ プ タ ー を 参 照 す る 。 こ れ は 2 つ の デ ィ ス ク リ プ タ ー が 同 じ フ ラ グ (mq_flags) を 共 有 す る こ と を 意 味 す る 。

* 子 プ ロ セ ス は 、 親 プ ロ セ ス の オ ー プ ン 済 み の デ ィ レ ク ト リ ス ト リ ー ム の 集 合

(opendir(3) 参 照 ) の コ ピ ー を 継 承 す る 。 POSIX.1−2001 で は 、 親 プ ロ セ ス と 子 プ ロ セ ス 間 の 対 応 す る デ ィ レ ク ト リ ス ト リ ー ム は デ ィ レ ク ト リ ス ト リ ー ム の 位 置 (positioning) を 共 有 し て も よ い と さ れ て い る 。 Linux/glibc で は デ ィ レ ク ト リ ス ト リ ー ム の 位 置 の 共 有 は 行 わ れ て い な い 。

返 り 値

成 功 し た 場 合 、 親 プ ロ セ ス に は 子 プ ロ セ ス の PID が 返 さ れ 、 子 プ ロ セ ス に は 0 が 返 さ れ る 。 失 敗 し た 場 合 、 親 プ ロ セ ス に −1 が 返 さ れ 、 子 プ ロ セ ス は 生 成 さ れ ず 、 errno が 適 切 に 設 定 さ れ る 。

エ ラ ー

EAGAIN 親 プ ロ セ ス の ペ ー ジ テ ー ブ ル の コ ピ ー と 子 プ ロ セ ス の タ ス ク 構 造 に 生 成 に 必 要 な メ モ リ ー を

fork() が 割 り 当 て る こ と が で き な か っ た 。

EAGAIN シ ス テ ム で 設 定 さ れ た ス レ ッ ド 数 の 上 限 に 達 し て い た 。 こ の エ ラ ー の 原 因 と な る 上 限 値 は い く つ か あ る 。 実 ユ ー ザ ー

ID 当 た り の プ ロ セ ス 数 と ス レ ッ ド 数 の 上 限 で あ る 、 ソ フ ト リ ソ ー ス 上 限 RLIMIT_NPROC に 達 し て い た (setrlimit(2) で 設 定 で き る )。 カ ー ネ ル の シ ス テ ム 全 体 の プ ロ セ ス と ス レ ッ ド の 上 限 数 で あ る /proc/sys/kernel/threads−max が 達 し て い た (proc(5) 参 照 )。 PID の 最 大 値 /proc/sys/kernel/pid_max に 達 し て い た (proc(5) 参 照 )。

EAGAIN 呼 び 出 し 元 は 、 ス ケ ジ ュ ー リ ン グ ポ リ シ ー

SCHED_DEADLINE で 動 作 し て

お り 、 か つ reset−on−fork フ ラ グ が セ ッ ト さ れ て い な い 。 sched(7) 参 照 。

ENOMEM メ モ リ ー が 足 り な い た め に 、

fork() は 必 要 な カ ー ネ ル 構 造 体 を 割 り

当 て る こ と が で き な か っ た 。

ENOSYS

fork() は こ の プ ラ ッ ト フ ォ ー ム で は サ ポ ー ト さ れ て い な い (例 え ば 、 メ モ リ ー 管 理 ユ ニ ッ ト (MMU) が な い ハ ー ド ウ ェ ア )。

準 拠

SVr4, 4.3BSD, POSIX.1−2001.

注 意

Linux で は 、 fork() を 書 き 込 み 時 コ ピ ー (copy−on−write) ペ ー ジ を 用 い て 実 装 し て い る 。 し た が っ て 、 fork を 行 う こ と の 唯 一 の デ メ リ ッ ト は 、 親 プ ロ セ ス の ペ ー ジ テ ー ブ ル を 複 製 と 子 プ ロ セ ス 自 身 の タ ス ク 構 造 の 作 成 の た め の 時 間 と メ モ リ ー が 必 要 な こ と で あ る 。

glibc 2.3.3 以 降 で は 、 NPTL ス レ ッ ド 実 装 の 一 部 と し て 提 供 さ れ て い る glibc の fork() ラ ッ パ ー 関 数 は 、 カ ー ネ ル の fork() シ ス テ ム コ ー ル を 起 動 す る の で は な く 、 clone(2) を 起 動 す る 。 clone(2) に 渡 す フ ラ グ と し て 、 伝 統 的 な fork() シ ス テ ム コ ー ル と 同 じ 効 果 が 得 ら れ る よ う な フ ラ グ が 指 定 さ れ る (fork() の 呼 び 出 し は 、 flagsSIGCHLD だ け を 指 定 し て clone(2) を 呼 び 出 す の と 等 価 で あ る )。 glibc の ラ ッ パ ー 関 数 は pthread_atfork(3) を 使 っ て 設 定 さ れ て い る 任 意 の fork ハ ン ド ラ ー を 起 動 す る 。

pipe(2) お よ び wait(2) を 参 照 。

関 連 項 目

clone(2), execve(2), exit(2), setrlimit(2), unshare(2), vfork(2), wait(2), daemon(3), capabilities(7), credentials(7)

こ の 文 書 に つ い て

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