タグ

forkに関するryochackのブックマーク (4)

  • プロセスをforkするときのこと - Hibariya

    孤児プロセスとゾンビプロセスの違いがうまく理解できてなかったけど、ようやく違いを確認することができた。 孤児プロセス 孤児プロセスは、親プロセスがwaitせずに先に逝ってしまった後も走り続けている子プロセス。 Orphan Process とも呼ばれる。 親のいなくなった子プロセスはinitプロセスの子(孤児)になる。 親プロセスが死んで、子プロセスの親が変化する様子を見るには以下のようなスクリプトを実行したあとでファイルをtailすると分かりやすそう。 Process.fork do File.open('orphan', 'a') do |f| loop do sleep 1 # 親プロセスのpidをファイルに書き出す f.puts Process.ppid f.flush end end end sleep 5 このプログラムを実行して、orphanをtail -fで観察していると、

    ryochack
    ryochack 2015/02/10
    double forkについて
  • forkとゾンビプロセス

    とあるアプリから外部コマンドを実行する機能を実装していたんだけど、ふと気がついたらゾンビプロセスが大量にできていて焦った。 とあるアプリはデーモンプロセスでずっと生きている 外部コマンドは終了を待たなくていいし出力も取らなくていい ゾンビができちゃうダメな実装 とにかく実行すればいいってことで単純に次のようなコードを書いていた。 forkしてexecするだけという至って単純な実装(実際にはSTDOUTを/dev/nullに向けるとか色々あるけど)。 # 外部コマンドを実行する # コマンドの出力とか終了には興味がない def run_command(command) fork do puts "child: pid=#{Process.pid}, ppid=#{Process.ppid}" exec(command) end end puts "app: pid=#{Process.pid

    ryochack
    ryochack 2015/02/10
    "子プロセスを生成した後はwaitでその終了を待って終了ステータスを得るのだが、逆に言うとwaitを呼ぶまではたとえ子プロセスが終了していても終了ステータスを保持しておかなければならない。"
  • forkとwaitとゾンビプロセス - ファイヤープロジェクト

    forkはプロセスのコピーを作成する.そしてwaitで待つ.処理の流れが一から複数に分かれる様がフォークみたいだからforkなのだろうか. forkで何がコピーされるのか forkのサンプル wait waitのサンプル ゾンビプロセスについて forkで何がコピーされるのかforkはそれを実行したプロセスの子プロセスを作成する.子プロセスは親プロセスのコピーである.プロセスをどこまで実行したか(プログラムカウンタ?)もコピーされるので,子プロセスはforkの返り値が返るところから実行される(と,思う).あと,ファイルディスクリプタなどもオープンされていればそのままコピーされる.コピーされないのはpidやppidとファイルロックやサスペンド中のシグナルぐらいだろうか.そして,そのforkの返り値によって,プロセスは自分が親プロセスか子プロセスかを知ることができる. 成功すれば子プロセスに

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

    fork() can fail: this is important あー、fork()のことね。プロセスがもっとプロセス作るためのやつな。いや、他にもプロセス作る方法はあるけどな。ま、面白い話がもうひとつあるから聞かせてやるよ。 forkは失敗するんだぜ。分かってるか? マジで分かってるか? マジだぜ。forkは失敗するもんだ。mallocと同じさ。失敗することもある。そんなに頻繁にってわけじゃないけどさ、でも失敗したら、無視できっこないぜ。ちっとは脳みそ働かせなきゃならん。 forkが0を返したら、そいつは子プロセスで、親なら正数を返すってことは、みんな知ってるよな。その値は子のpidだ。こいつを保存しといて、あとで使うってわけだ。 失敗を確認しない場合どうなるか知ってるか? そうだよ。お前多分、"-1"(forkのエラー通知)をpidとして扱ってるんだろ。 さて、問題の始まりだ。

    ryochack
    ryochack 2014/08/22
    これは恐ろしい…
  • 1