Forums » Ruby-dev » IO.popen raise Errno::EBADF

IO.popen raise Errno::EBADF
Posted by $B$H$_$?$^$5$R$m(B (Guest)
on 24.04.2006 17:21
$B$H$_$?$G$9!#(B

IO.popen() $B$G(B fork $B$K<:GT$7$?;~$N%(%i!<$,(B EBADF 
$B$K$J$k$3$H$,$"$j$^$9!#(B

~% ruby -v
ruby 1.8.4 (2005-12-24) [i686-linux]
~% ruby -e '"1"*1024*1024*500; IO.popen("cat","w")'
-e:1:in `popen': Bad file descriptor - cat (Errno::EBADF)
        from -e:1

strace $B$N7k2L$O$3$s$J46$8!#(B

25722 pipe([3, 4])                      = 0
25722 clone(child_stack=0, 
flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, 
child_tidptr=0xb7e1c0c8) = -1 ENOMEM (Cannot allocate memory)
25722 close(-1081300760)                = -1 EBADF (Bad file descriptor)
25722 close(4)                          = 0

$B$H$$$&$3$H$G!"$*$=$i$/$3$s$J46$8$G$O$J$$$+$H!#(B

--- io.c.orig   2005-12-20 02:11:20.000000000 +0900
+++ io.c        2006-04-24 23:49:48.000000000 +0900
@@ -2994,7 +2994,14 @@
            rb_thread_sleep(1);
            goto retry;
        }
-       close(pr[0]); close(pw[1]);
+       if ((modef & FMODE_READABLE)) {
+         close(pr[0]);
+         close(pr[1]);
+       }
+       if ((modef & FMODE_WRITABLE)) {
+         close(pw[0]);
+         close(pw[1]);
+       }
        rb_sys_fail(pname);
        break;