なかだです。

At Mon, 20 May 2002 12:47:59 +0900,
Nobuyoshi-Nakada wrote:
> なんでR/Wのパイプをdupしたのをclose_writeするとエラーになるのか、
> 不思議だったんですが、ここではまだfptr->f2はNULLのままです。

例が間違ってました。"r+"を付けないと。

$ ruby-1.6 -ve 'f = open("|-","r+") or sleep; f.dup.close_write'
ruby 1.6.7 (2002-05-16) [i686-linux]
-e:1:in `close_write': closing non-duplex IO for writing (IOError)
        from -e:1
$ ruby-1.7 -ve 'f = open("|-","r+") or sleep; f.dup.close_write'
ruby 1.7.2 (2002-05-16) [i686-linux]
-e:1:in `close_write': closing non-duplex IO for writing (IOError)
        from -e:1

おまけにもう一ヶ所修正が必要でした。


Index: io.c =================================================================== RCS file: /cvs/ruby/src/ruby/io.c,v retrieving revision 1.137 diff -u -2 -p -r1.137 io.c --- io.c 2002/05/02 07:50:36 1.137 +++ io.c 2002/05/20 04:15:35 @@ -2228,9 +2228,9 @@ rb_io_clone(io) fd = ruby_dup(fileno(orig->f)); fptr->f = rb_fdopen(fd, mode); - if (fptr->f2) { + if (orig->f2) { if (fileno(orig->f) != fileno(orig->f2)) { fd = ruby_dup(fileno(orig->f2)); } - fptr->f = rb_fdopen(fd, "w"); + fptr->f2 = rb_fdopen(fd, "w"); } if (fptr->mode & FMODE_BINMODE) {
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦