From: Takahiro Kambe Date: 2000-12-02T16:05:55+09:00 Subject: [ruby-list:26258] Re: fork problem? In message <3A287422384.A2B9.BXQ04723@nifty.ne.jp> on Sat, 2 Dec 2000 12:59:14 +0900, Nakamura Akifumi wrote: > fork()の役割は、ObjectだのThreadだのによって、今では既に > (より良く)置き換え可能なのではないか、というか。 > > fork()をなんらかの形で必要としている「他の」プロセスを > fork()させるんならともかく、rubyの自プロセスをfork()させるっての、 > …要るものなんですね…意外だな…というか。 rubyではありませんが、perlでそういうCGIを書いたことがあります。 1. CGIプロセスは排他的なファイルへのアクセスを行う。 2. そのファイルの更新に伴い、時間のかかる他のファイル作成等も行う。 3. 2.が終わるまで排他的なファイルは確保したままでなければならない。 この時間のかかるのが10分とか20分といった感じでかかるので、そのままだと Webのブラウザの方がタイムアウトしてしまいます。そこで、 1. CGIプロセスは排他的なファイルの確保(ロック)を行った上で修正する。 2. fork()します。 3. 子供は親の終了の影響を受けない様にした上で時間のかかる作業を続けま す。排他的なファイルの確保は親と同じファイル記述子という形で保持し 続けます。 4. 親はWebサーバにとっととレスポンスを返して終了します。これで、Webサー バはクライアントのブラウザに「終わったぜぃ」と返事ができます。 という形の実装で逃げました。この場合、fork()することで、 o CGIプロセスの親プロセス(Webサーバ)に終わったと思わせる。 o CGIプロセスが確保した資源をそのまま子プロセスに引き継がせる。 といったことを達成しています。引き継がせているのはファイタ的なファイル の確保だけではなく、そのファイルを読んだ結果得たデータ(オブジェクトと 言い替えて良いでしょう)も4.の処理で使っていますが、fork()後にプロセス をexecするのでは効率よく実現はできません。 といったオブジェクト指向といったところから、ずっと離れたレベルですが、 fork()なくしてはできないことと思いますが、いかがでしょう? -- 神戸 隆博(かんべ たかひろ) at home