From: "とみたまさひろ" Date: 2006-04-25T00:18:41+09:00 Subject: [ruby-dev:28600] IO.popen raise Errno::EBADF とみたです。 IO.popen() で fork に失敗した時のエラーが EBADF になることがあります。 ~% 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 の結果はこんな感じ。 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 ということで、おそらくこんな感じではないかと。 --- 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; -- とみたまさひろ 3469 42CC 4D32 F53C AD98 65A5 8C37 FF09 69C1 6040