##疑問
・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