From: Hiroshi migimatsu ^^ Date: 2006-07-11T02:22:35+09:00 Subject: [ruby-list:42565] Re: IO::select() の dead lock ? みんつです. ありがとうございます. まつもとさん wrote: > めったに起きない現象だそうですから、原因の特定は難しいかもし > れませんが。 以下のシーケンスに陥れば,確実に再現しているのですが,試験環境 で作り出すのに苦労してますです. > | 切替元サーバは telnet コネクションが継続してるとみなして, > | データを送って来ているのですが,telnet クライアントはアド > | レスが変わった切替先のサーバに応答をしています. > | > | 切替元 [データ] --> Net::telnet --> [ACK] 切替先 > | <-- [RST] > |     [ 再送 ] --> --> [ACK] > | <-- [RST] > うーむ。これはこれで難儀な...。 ええ,サーバを切替えるのならプロセス終了処理くらいやれよ, っつうか.なんでこんな後処理をクライアント側で面倒見なきゃ いけないのか.ぷんぷん. (-_-; ともあれ,デッドロックはいかにもまづいので. > Net::telnet()内IO::selectというのはtelnet.rb何行目に登場する > IO::selectでしょうか。telnet.rbには3ヶ所selectが登場するので > すが、ふたつはwaitforメソッド、もうひとつはwriteメソッドです。 waitfor() 内,549 行の方です.550 行の方でも起きるのかもし れませんけれど. > また、net/telnet自身はスレッドを使っていませんが、クライアン > トプログラムはスレッドを利用しているのでしょうか。その辺も関 > 係があるかもしれません。 クライアントでは(timeout で括った時は別にして)スレッドを 使っていません. IO::select() でスレッド動作可能にするためにスレッドの切替え 動作をしていますよね.ある条件下では,その動作の果てに ブロッキング select() を呼び出してしまうことがあるのではない かと,ソースとにらめっこしているのですけれど. # とりあえず今は syscall で alarm() 呼んで逃げてます (^^; -- みんつ - minz@minz.org - みぎまつひろし