$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;
IO.popen raise Errno::EBADF
on 24.04.2006 17:21
