青木です。

  In mail "[ruby-dev:25756] Re: I/O operation differs signal handler"
  Tanaka Akira <akr / m17n.org> wrote:

> > 以下のようなプログラムを実行して SIGTERM を送っても、
> > $stdin.gets が戻るまでシグナルハンドラが実行されません。

> > なお、上記のコードが動作しない原因は [ruby-dev:25003] で導入された
> > signal.c:1.55 がそのままになっていることだと思います。そのあとの
> > 展開でこのリビジョンの変更は不要になっているはずなので、巻き戻す
> > べきではないでしょうか。
> 
> その方向の変更は、データが蒸発・重複する原因を除去困難にするため、あま
> り賛成できません。
> 
> その問題は次のどちらかで解決できないでしょうか。
> 
> * Thread.new { sleep } とかをいれて、マルチスレッドにする
>   read の前の select でブロックが起これば、signal handler は即座に起動
>   するかも知れない

うーむ……

  Thread.fork { loop { sleep 1 } }

を入れたら、とりあえず「ちゃんと停止する」という目的は果たせました。
-------------------------------------------------------------------
青木峰郎