Man page - fork(2)

Packages contains this manual

Available languages:

en fr it pl nl ja ru de

Manual

FORK

名 前
書 式
説 明
返 り 値
エ ラ ー
準 拠
注 意
C ラ イ ブ ラ リ と カ ー ネ ル の 違 い

関 連 項 目
こ の 文 書 に つ い て

名 前

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

書 式

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

pid_t fork(void);

説 明

fork () は 呼 び 出 し 元 プ ロ セ ス を 複 製 し て 新 し い プ ロ セ ス を 生 成 す る 。 新 し い プ ロ セ ス は 「 子 」 プ ロ セ ス と 呼 ば れ 、 呼 び 出 し 元 プ ロ セ ス は 「 親 」 プ ロ セ ス と 呼 ば れ る 。

The child process and the parent process run in separate memory spaces. At the time of fork () both memory spaces have the same content. Memory writes, file mappings ( mmap (2)), and unmappings ( munmap (2)) performed by one of the processes do not affect the other.

The child process is an exact duplicate of the parent process except for the following points:

*

The child has its own unique process ID, and this PID does not match the ID of any existing process group ( setpgid (2)) or session.

*

子 プ ロ セ ス の 親 プ ロ セ ス 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 で 全 て 指 定 さ れ て い る 。 親 プ ロ セ ス と 子 プ ロ セ ス は 、 以 下 の 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 () に よ っ て 引 き 継 が れ な い 。

*

Memory in address ranges that have been marked with the madvise (2) MADV_WIPEONFORK flag is zeroed in the child after a fork (). (The MADV_WIPEONFORK setting remains in place for those address ranges in the child.)

*

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

*

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

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

*

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

*

After a fork () in a multithreaded program, the child can safely call only async-signal-safe functions (see signal-safety (7)) until such time as it calls execve (2).

*

子 プ ロ セ ス は 親 プ ロ セ ス が 持 つ オ ー プ ン フ ァ イ ル デ ィ ス ク リ プ タ ー の 集 合 の コ ピ ー を 引 き 継 ぐ 。 子 プ ロ セ ス の 各 フ ァ イ ル デ ィ ス ク リ プ タ ー は 、 親 プ ロ セ ス の フ ァ イ ル デ ィ ス ク リ プ タ ー に 対 応 す る 同 じ オ ー プ ン フ ァ イ ル 記 述 (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 で は 、 親 プ ロ セ ス と 子 プ ロ セ ス 間 の 対 応 す る デ ィ レ ク ト リ ス ト リ ー ム は デ ィ レ ク ト リ ス ト リ ー ム の 位 置 (positioning) を 共 有 し て も よ い と さ れ て い る 。 Linux/glibc で は デ ィ レ ク ト リ ス ト リ ー ム の 位 置 の 共 有 は 行 わ れ て い な い 。

返 り 値

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

エ ラ ー

EAGAIN

A system-imposed limit on the number of threads was encountered. There are a number of limits that may trigger this error:

*

the RLIMIT_NPROC soft resource limit (set via setrlimit (2)), which limits the number of processes and threads for a real user ID, was reached;

*

the kernel’s system-wide limit on the number of processes and threads, /proc/sys/kernel/threads-max , was reached (see proc (5));

*

the maximum number of PIDs, /proc/sys/kernel/pid_max , was reached (see proc (5)); or

*

the PID limit ( pids.max ) imposed by the cgroup "process number" (PIDs) controller was reached.

EAGAIN

呼 び 出 し 元 は 、 ス ケ ジ ュ ー リ ン グ ポ リ シ ー SCHED_DEADLINE で 動 作 し て お り 、 か つ reset-on-fork フ ラ グ が セ ッ ト さ れ て い な い 。 sched (7) 参 照 。

ENOMEM

メ モ リ ー が 足 り な い た め に 、 fork () は 必 要 な カ ー ネ ル 構 造 体 を 割 り 当 て る こ と が で き な か っ た 。

ENOMEM

An attempt was made to create a child process in a PID namespace whose "init" process has terminated. See pid_namespaces (7).

ENOSYS

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

ERESTARTNOINTR (Linux 2.6.17 以 降 )

System call was interrupted by a signal and will be restarted. (This can be seen only during a trace.)

準 拠

POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

注 意

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

C ラ イ ブ ラ リ と カ ー ネ ル の 違 い

glibc 2.3.3 以 降 で は 、 NPTL ス レ ッ ド 実 装 の 一 部 と し て 提 供 さ れ て い る glibc の fork () ラ ッ パ ー 関 数 は 、 カ ー ネ ル の fork () シ ス テ ム コ ー ル を 起 動 す る の で は な く 、 clone (2) を 起 動 す る 。 clone (2) に 渡 す フ ラ グ と し て 、 伝 統 的 な fork () シ ス テ ム コ ー ル と 同 じ 効 果 が 得 ら れ る よ う な フ ラ グ が 指 定 さ れ る ( fork () の 呼 び 出 し は 、 flags SIGCHLD だ け を 指 定 し て 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), pthread_atfork (3), capabilities (7), credentials (7)

こ の 文 書 に つ い て

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