From: "とみたまさひろ" Date: 2002-08-02T07:24:50+09:00 Subject: [ruby-dev:17878] write EINTR by SIGVTALRM とみたです。 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. とあり、おそらくこれに引っ掛かってしまっているんじゃないかと思います。 どんなもんでしょうか。 -- とみたまさひろ