From: Yusuke ENDOH Date: 2008-10-10T02:04:11+09:00 Subject: [ruby-dev:36697] [Bug:1.9] rb_io_fread does not work 遠藤です。 DEPRECATED(int rb_getc(FILE*)); DEPRECATED(long rb_io_fread(char *, long, FILE *)); DEPRECATED(long rb_io_fwrite(const char *, long, FILE *)); DEPRECATED(int rb_read_pending(FILE*)); というのが ruby/io.h にありますが、試しにこれらを使ってみた ところ、インタプリタがフリーズしました。 $ ../ruby -rfoo -e 'foo' (^C が効かない) 実際、rb_io_fread が io_fread を呼び、READ_DATA_PENDING で 未初期化の rbuf_len を参照していて、まともに動くような感じ ではないように見えました。 rb_io_fwrite も動いていないような気がします。 README.EXT に記載されていないのであれば、中途半端に残すより 削除してしまったらどうでしょうか。 以下、検証に使ったコードです。 もし使い方が間違っていたらすみません。 #include "ruby.h" #include "ruby/io.h" VALUE foo(VALUE self) { int i; char buf[11]; FILE *fp; fp = fopen("foo", "r+"); i = rb_io_fread(buf, 10, fp); buf[i] = '\0'; fclose(fp); printf("\"%s\"\n", buf); /* fp = fopen("bar", "w"); rb_io_fwrite("foobarbaz\n", 10, fp); fflush(fp); fclose(fp); */ return Qnil; } void Init_foo() { rb_define_global_function("foo", foo, 0); } -- Yusuke ENDOH