[#36686] 1.1 < 61.1 - 60.0 — Shin-ichiro HARA <sinara@...>

原です。

19 messages 2002/12/06

[#36770] www.ruby-lang.orgリニューアル準備のお知らせ — TADA Tadashi <sho@...>

ruby-lang.orgのwebmasterチームでは、タイムリーな情報提供と使いやすい

11 messages 2002/12/16

[ruby-list:36868] Re: ruby 1.8.0 (server lock?)

From: nobu.nakada@...
Date: 2002-12-28 19:52:39 UTC
List: ruby-list #36868
なかだです。

At Sun, 29 Dec 2002 02:43:44 +0900,
em6t-kbt@asahi-net.or.jp wrote:
> プロセスとスレッドの言葉の意味は、とりあえず、forkした場合に
> できるのはプロセス、Thread.startの場合はスレッドだと思ってい
> ます。

そうです。

> プロセスの一番上になる親スレッドが終了した場合、そのプロセス
> に属するスレッドはすべてその時点で終了する。

Rubyではスレッドにとくに親子関係はありませんが、最初から存在す
るメインスレッドというものがあります。これが終了するとプロセス
全体が終了します。そして、1.7以降ではforkした子プロセスではfork
を呼び出したスレッドがメインスレッドになり、他のスレッドは消滅
します。

> > プロセ
> > スをバックグラウンドで走らせたいなら、先に fork && exit する必
> > 要があります。
> 
> プログラムを下記のように変更して、無事動きました。exitはruby
> のコマンドかと思ったのですが、普通のプロセスの終了のことなん
> ですな。

その二つをどう区別されてるのかよく分かりませんが、exitは自分自
身のプロセスを終了させるメソッドです。

最初([ruby-list:36842])のコードの動作を説明すると、スレッド(T1)
が分岐した後、メインスレッド(T0)でforkします。ここで、親プロセ
スのほうはブロックに入らずに次に進みますが、そこでコードは終り
なのでメインスレッドおよびプロセスは終了します。子プロセスのT1'
は、1.6なら生きているのですが1.8では消滅してしまって、残ったメ
インスレッドT0'だけがずっとsleepし続けることになります。

  T0 ----+------------------+-------> exit
         | Thread.start     | fork
  T1     +----> open -------|+------> exit
                            ||
  親プロセス                ||
      ......................v|..............
  子プロセス                |v
                            ||
  T0'                       +-------> sleep
                             | (1.6のみ)
  T1'                        +--> open ...

もし親プロセスがexitせずに動き続けた場合、T1とT1'の両方がopenし
ようとすることになります。1.8では、メイン以外のスレッドを終了さ
せることで、こういった競合をとりあえず回避しようとしています。

> fork {
>   Thread.start do
>     gsock = TCPServer.open(8080)
>     socket = gsock.accept
>     socket.puts("Hello, world")
>     socket.close()
>   end
>   sleep
> }

ついでに、こちらの流れはこうなります。

  T0 -------------+-----------------> exit
                  | fork
  親プロセス      |
      ............v..............
  子プロセス      |
                  |
  T0'             +-----+-----------> sleep
                        | Thread.start
  T1'                   +----> open ...

メインの処理をforkのブロックに入れずに、こうしても同じことです。

  fork && exit		# 親プロセスを終了
  # Process.setsid	# デーモン化する場合
  Thread.start do
    # ....
  end
  sleep

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread