Bug #1807
r+ オープンしたファイルが MinGW の拡張ライブラリで扱えない
| Status: | Closed | Start date: | 07/23/2009 | |
|---|---|---|---|---|
| Priority: | Normal | Due date: | ||
| Assignee: | % Done: | 100% |
||
| Category: | - | |||
| Target version: | 2.0.0 | |||
| ruby -v: | ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32] |
Description
手元に FILE* を扱う拡張ライブラリがあり、1.9 へ移植しているのですが、
Windows (MinGW) でうまくいかない処理があります。
処理としては、以下のように GetOpenFile -> rb_io_stdio_file で
取り出した FILE* から何かを読む、というだけの処理なのですが、
r+ でオープンすると何も読むことができません。
/* 拡張ライブラリサンプル */
#include <stdio.h>
#include <ruby.h>
#include <ruby/io.h> /* 1.8 では <rubyio.h> */
static VALUE fget(VALUE self, VALUE arg) {
rb_io_t* fptr;
FILE* f;
int i;
GetOpenFile(arg, fptr);
rb_io_check_readable(fptr);
f = rb_io_stdio_file(fptr); /* 1.8 では GetReadFile */
if ((i = fgetc(f)) != EOF) {
char c = i;
return rb_str_new(&c, 1);
}
return Qnil;
}
void Init_fget() {
rb_define_singleton_method(
rb_define_module("F"),
"get", RUBY_METHOD_FUNC(fget), 1
);
}
# Ruby側サンプル
require './fget.so'
File.open('test.dat', 'w') {|f| f.write "123" }
File.open('test.dat', 'r+') {|f| # 読めない(rb+も同様)
p F.get(f) # => nil
p F.get(f) # => nil
p F.get(f) # => nil
}
File.open('test.dat', 'r') {|f| # 読める(rbも同様)
p F.get(f) # => "1"
p F.get(f) # => "2"
p F.get(f) # => "3"
}
Linux の Ruby 1.9.1 では問題ありません。
1.9 の IO 周りはかなり変わったようなので、もしおかしなことを
しているようならご指摘下さい。
Associated revisions
History
Updated by usa (Usaku NAKAMURA) almost 3 years ago
- Assignee set to usa (Usaku NAKAMURA)
- Target version set to 2.0.0
Updated by usa (Usaku NAKAMURA) almost 3 years ago
こんにちは、なかむら(う)です。 In message "[ruby-dev:38882] [Bug #1807] r+ オープンしたファイルが MinGW の拡張ライブラリで扱えない" on Jul.23,2009 12:00:22, <redmine@ruby-lang.org> wrote: > 処理としては、以下のように GetOpenFile -> rb_io_stdio_file で > 取り出した FILE* から何かを読む、というだけの処理なのですが、 > r+ でオープンすると何も読むことができません。 調査の過程で微妙なバグを発見しました。 修正の結果、trunkでは "r+" のみならず "r" の場合も、fget()で -1が返るようになりました。 って、全然元の問題は解決しないで悪化してるわけですが(すみませ ん)、原因の方は判明しました。 ruby内部ではファイルをFILE_FLAG_OVERLAPPED付きでオープンして いるため、Cランタイムでファイルを読み書きしようとしてしまうと 必ずEINVALになるようになってしまっています。 どうやったら問題を回避できるかは現在研究中です。 それでは。 -- U.Nakamura <usa@garbagecollect.jp>
Updated by usa (Usaku NAKAMURA) almost 3 years ago
- Status changed from Open to Assigned
Updated by usa (Usaku NAKAMURA) about 2 years ago
- Status changed from Assigned to Closed
- % Done changed from 0 to 100
This issue was solved with changeset r27449. Kimura, thank you for reporting this issue. Your contribution to Ruby is greatly appreciated. May Ruby be with you.