From: nobu@... Date: 2004-12-26T15:24:06+09:00 Subject: [ruby-dev:25337] Re: test_readline.rb blocks on BSD again なかだです。 At Sun, 26 Dec 2004 15:12:34 +0900, Tanaka Akira wrote in [ruby-dev:25334]: > >> んーと、こっちは freopen が責任を持って FILE 内のモードを変えてくれる > >> と思うので、モードが食い違うことは起きないと思うんですよね。それなのに > >> 禁止するのはなぜでしょう? > > > > なるほど、いわれてみれば確かにその通り。 > > あとから気がついたのですが、freopen でモードを変えることを許すと、 > > | + fptr->mode &= ~FMODE_READWRITE; > | + fptr->mode |= (fptr->f == stdin) ? FMODE_READABLE : FMODE_WRITABLE; > > という固定的なのはまずくて、もともとの fptr->mode & FMODE_READWRITE を > 残しておくようにしないと食い違いますね。 こうするということでしょうか。 @@ -3166,5 +3166,11 @@ io_reopen(io, nfile) /* copy OpenFile structure */ - fptr->mode = orig->mode; + if (fptr->f == stdin || fptr->f == stdout || fptr->f == stderr) { + fptr->mode = ((fptr->mode & FMODE_READWRITE) | + (orig->mode & ~FMODE_READWRITE)); + } + else { + fptr->mode = orig->mode; + } fptr->pid = orig->pid; fptr->lineno = orig->lineno; > しかし、さらに考えてみると freopen で FILE 内のモードを変えられるなら、 > STDIN.reopen(STDOUT) とかでも、とりあえず stdin を freopen で w にして > から dup2 で fd をすり替えればなんとかなるのではないかとも思ったりしま > した。まぁ、そうやって嬉しいことがあるのかというと疑わしいものがありま > すが。 何をfreopen()すればいいんでしょう。/dev/null? あと、freopen()っ てfdが同じになると決まってましたっけ。でないと、サブプロセスを リダイレクトしたりできなくなりそうなんですが。 -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦