2014-08-21

fork()は失敗するんだぜ、覚えときな

fork() can fail: this is important

あー、fork()のことね。プロセスがもっとプロセス作るためのやつな。いや、他にもプロセス作る方法はあるけどな。ま、面白い話がもうひとつあるから聞かせてやるよ。

forkは失敗するんだぜ。分かってるか? マジで分かってるか? マジだぜ。forkは失敗するもんだ。mallocと同じさ。失敗することもある。そんなに頻繁にってわけじゃないけどさ、でも失敗したら、無視できっこないぜ。ちっとは脳みそ働かせなきゃならん。

forkが0を返したら、そいつは子プロセスで、親なら正数を返すってことは、みんな知ってるよな。その値は子のpidだ。こいつを保存しといて、あとで使うってわけだ。

失敗を確認しない場合どうなるか知ってるか? そうだよ。お前多分、"-1"(forkのエラー通知)をpidとして扱ってるんだろ。

さて、問題の始まりだ。本当の問題は、シグナルを送るときにやってくるんだ。たとえば、お前、子プロセスを終了させたいとするだろ。

おまえkill(pid, signal)してるか? いや、kill(pid, 9)してるかな。

お前、pidが-1だったときどうなるか知ってるか? マジで知ってるべきだぜ。ヤバイからな。マジモンにヤバイぜ。

...

...

...

ほら、俺のLinux機からkill(2)のmanページをコピペしてやるよ。

もし、pidが-1と等しい場合、呼び出したプロセスがシグナルを送る権限を持つすべてのプロセスにsigが送られる。ただし、process 1(init)を除く

お分かりか? "pid -1"をkillするってのは、シグナル送れるすべてのプロセスを虐殺するってことだぜ。お前がrootなら、ほとんどすべてだ。お前は生き残るし、initも生き残る。だがそれだけだ。他は全部死ぬ。

お前、プロセスを管理するコード書いてるか? お前、テキストコンソールのgetty/login(initによって再起動される)とプロセスマネージャー以外ぜんぶ死んだ経験はないか? お前カーネルのoomkillerの責任だと思ったか?

そいつぁ濡れ衣かもしれないぜ。kill -1してないか今すぐ確認しろ。

Unix: この業界を飽きさせないために十分な数の落とし穴とトラバサミが仕掛けられている

ドワンゴ広告

この記事はドワンゴ出勤前に自宅で書いた。やはり作業はL字型の広い机で行うに限る。

ドワンゴは本物のC++プログラマーを募集しています。

採用情報|株式会社ドワンゴ

CC BY-ND 4.0: Creative Commons — Attribution-NoDerivatives 4.0 International — CC BY-ND 4.0

4 comments:

Taku Miyakawa said...

"one of them" は「片方が」ではなく「一つの方法」だと思います。 clone, vfork, fork のうちの一つ、という意味かと。

江添亮 said...

なるほど、追加でposix_spawnも。

Anonymous said...

メモリーリークとの会わせ技でむかぢHPUXでそんな事があったな。

Anonymous said...

不自由なOSでは「GetMessageは失敗する」というのが有名ですね。
http://blogs.msdn.com/b/oldnewthing/archive/2013/03/22/10404367.aspx