なかだです。

At Tue, 6 Jan 2004 02:25:49 +0900,
Minero Aoki wrote:
> > > #4  0x50388 in rb_bug (fmt=0xea178 "rb_sys_fail(%s) - errno == 0")
> > >     at error.c:199
> > > #5  0x51dd0 in rb_sys_fail (mesg=0x0) at error.c:899
> > > #6  0x68458 in fptr_finalize (fptr=0x4015a668, noraise=0) at io.c:1371
> 
> (ladebug) where
> >0  0x3ff800e93f8 in __kill(...) in /usr/shlib/libc.so
> #1  0x3ff80213190 in UnknownProcedure18FromFile10(...) in /usr/shlib/libc.so
> #2  0x3ff8013bfd4 in __tis_raise(...) in /usr/shlib/libc.so
> #3  0x3ff801c97c8 in abort(...) in /usr/shlib/libc.so
> #4  0x120052bd0 in rb_bug(fmt=0x140003520="rb_sys_fail(%s) - errno == 0") "error.c":207
> #5  0x120054994 in rb_sys_fail(mesg=0x0) "error.c":986
> #6  0x12007caf8 in fptr_finalize(fptr=0x140479240, noraise=0) "io.c":1757

ここでのn1、n2とeの値ってどうなってますか。

> > HP-UX と UX/4800 の場合、fclose が EOF を返しても errno が設定されない
> > 場合があるようです。このことが原因でしょうか。
> 
> こちらは違っていました。
> 
> > % a.out a.out
> > fp=7b030f68
> > fclose=0, errno=12345
> > fclose=-1, errno=123456
> 
>   ~/tmp % ./a.out close.c
>   fp=3ffc00800f8
>   fclose=0, errno=12345
>   fclose=-1, errno=9
> 
> というふうに、ちゃんと errno=9 (EBADF) になっています。

可能性としては、fclose(fptr->f)の後でerrnoがクリアされてるって
とこでしょうか。


Index: io.c =================================================================== RCS file: /cvs/ruby/src/ruby/io.c,v retrieving revision 1.254 diff -u -2 -p -r1.254 io.c --- io.c 2 Jan 2004 16:21:15 -0000 1.254 +++ io.c 5 Jan 2004 17:50:28 -0000 @@ -1728,10 +1728,10 @@ fptr_finalize(fptr, noraise) int noraise; { - int n1 = 0, n2 = 0, e = 0, f1, f2 = -1; + int n1 = 0, n2 = 0, f1, f2 = -1; if (fptr->f2) { f2 = fileno(fptr->f2); - while ((n2 = fclose(fptr->f2)) < 0) { - e = errno; + while (fclose(fptr->f2) < 0) { + n2 = errno; if (!rb_io_wait_writable(f2)) { break; @@ -1743,5 +1743,6 @@ fptr_finalize(fptr, noraise) if (fptr->f) { f1 = fileno(fptr->f); - while ((n1 = fclose(fptr->f)) < 0) { + while (fclose(fptr->f) < 0) { + n1 = errno; if (f2 != -1 || !(fptr->mode & FMODE_WBUF)) break; if (!rb_io_wait_writable(f1)) break; @@ -1749,10 +1750,10 @@ fptr_finalize(fptr, noraise) } fptr->f = 0; - if (n1 < 0 && errno == EBADF && f1 == f2) { + if (n1 == EBADF && f1 == f2) { n1 = 0; } } - if (!noraise && (n1 < 0 || n2 < 0)) { - if (n1 == 0) errno = e; + if (!noraise && (n1 || n2)) { + errno = (n1 ? n1 : n2); rb_sys_fail(fptr->path); }
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦