高林と申します

ttyrec <http://namazu.org/~satoru/ttyrec/> というソフトウェ
アの Ruby ライブラリ <http://cvs.namazu.org/ruby-ttyplay/>
を作っています。

tail -f に似た、入力ファイルの持続的な読み込み:

  IO#read が nil を返してきたら、0.25秒待って再び IO#read を
  試みる、という無限ループ

を行う必要があったのですが、clearerr(3) に対応するメソッドが
見つからなかったので、rb_io_seekの中で clearerr(3)が呼ばれて
いたのを利用して、

  @input_stream.seek(0, IO::SEEK_CUR)  # substitute for clearerr(3)

のように誤魔化しました。(この行を入れないとうまく動かない)

しかし、ad hoc な対処法なので気持ちが悪いです。io.c に下のパッ
チを当てると、上の対処法が不要になりましたが、不用意に修正を
加えると副作用が出てしまうかもしれません。どうするのがいいの
でしょうね。案:

  1. IO#clearerr を作る
  2. IO#read のタイミングで clearerr(3) を行う (下のパッチ)
  3. そもそもきれいな解決法が既にある (高林が気づいていないだけ)

*** io.c~	Wed May 16 18:05:50 2001
--- io.c	Mon May 28 14:31:22 2001
***************
*** 574,579 ****
--- 574,580 ----
  	rb_raise(rb_eArgError, "negative length %d given", len);
      }
      GetOpenFile(io, fptr);
+     clearerr(fptr->f);
      rb_io_check_readable(fptr);
  
      if (feof(fptr->f)) return Qnil;

--
高林 哲 (Takabayashi, Satoru)
http://namazu.org/~satoru/