##疑問
・if pid.nil?はforkされた親プロセスでも子プロセスでも満たされないと考えているが、実際には子プロセスでは満たされている。その理由は何故か?
##詳細
https://github.com/Shinpeim/process-book/blob/master/004.md
githubに上がっているlinux系OSのプロセスについてとても分かりやすく解説してある記述を見つけて読んでいました。
その中に以下のコードがありました。
ruby
1# -*- coding: utf-8 -*- 2file = File.open("nyan.txt","r") 3 4# ファイルをopenしてからforkする 5 6pid = Process.fork 7 8if pid.nil? 9 #子プロセス 10 sleep 1 # 親プロセスがfileを閉じるのを待つ 11 12 # 親プロセスがfdを閉じてても、自分はまだ番号札を持ってるから読み込める 13 puts file.readlines.join 14 15 file.close #自分も番号札を返す 16else 17 # 親プロセス 18 file.close #番号札をOSに返す 19 Process.wait(pid) #子プロセスが終わるの待つ 20end
こちらのコードのif pid.nil?
に子プロセス
というコメント記述があり、実際に走らせた場合の子プロセス
のみ実行される内容が書いてあります。
しかし自分の解釈では、pid = Process.fork
とforkされた瞬間に、子プロセスもpid = Process.fork
まで読み終えた状態の親プロセス
とまったく同様なメモリの状態を保持していると考えています。
その為、子プロセスにおいてもpid
はnil
ではなく(自分のpid
が変数pid
には入っている)、else
の処理が走ってしまう(親プロセス
も子プロセス
もelse
の処理が走る)と考えてしまいます。
しかし実際には子プロセス
と親プロセス
は違う処理が走っています。
この考えの間違えている部分はどこなのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/20 02:31