とみたです。

OS: Solaris 8, Ruby:1.6.7

Thread を使ったプログラムで、ファイルからデータを読み込んでソケットに
書き出していると、ごく稀に Socket#write が Errno::EINTR になってしまう
ことがあります。

実際に問題が発生したのは TPOPS(http://www.tmtm.org/ja/ruby/tpops/)です。

システムコールトレース(truss)を取って調べてみると、SIGVTALRM で割り込
みが掛かっています。

10098:  poll(0xFFBE7C98, 1, 3594075)                    = 1
10098:          fd=5  ev=POLLRDNORM rev=POLLRDNORM
10098:  read(5, " 3 O D k K M D E y M z Q".., 1024)     = 1024
10098:      Received signal #28, SIGVTALRM, in write() [caught]
10098:  write(4, "\n M j M 0 N T Y 3 O D k".., 1024)    Err#4 EINTR

eval.c を読んでみると、Thread を使うと、CPU時間で 0.01秒毎に SIGVTALRM 
があがるようになるようですが、write(2) のマニュアルによると

     If write() is interrupted by a signal before it  writes  any
     data, it will return -1 with errno set to EINTR.

とあり、おそらくこれに引っ掛かってしまっているんじゃないかと思います。

どんなもんでしょうか。

-- 
とみたまさひろ <tommy / tmtm.org>