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() の 呼 び
出 し は 、 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), capabilities(7),
credentials(7)
こ の man ペ
ー ジ は Linux man−pages
プ ロ ジ ェ ク ト
の リ リ ー ス 3.79 の
一 部 で あ る 。
プ ロ ジ ェ ク ト
の 説 明 と バ グ
報 告 に 関 す る
情 報 は
http://www.kernel.org/doc/man−pages/ に 書
か れ て い る 。
|