From: WATANABE Hirofumi Date: 1997-09-10T18:48:23+09:00 Subject: [ruby-dev:453] Re: open, close, waitpid? わたなべです. Yukihiro Matsumoto writes: :|f1 = open("|cat", "w") :|f2 = open("|sed 's/a/b/'", "w") :|f1.print "Hello\n" :|f2.print "abc\n" :|f1.close :|f2.close :| :|これが block しちゃいます. close の順番を逆にすれば ok だけど. :|FILO じゃないと駄目なのなか? : :確かにそうなりますね.fclose()したのにサブプロセスにSIGPIPE :がいかないのか終了しないのが原因ですね.でも,なんでそうなる :のか良くわかってません.明示的にシグナルを送るべきか…. ところで perl ではどうだろうと等価なスクリプトを書いてみました. use IO::File; $f1 = IO::File->new; $f2 = IO::File->new; $f1->open("|cat"); $f2->open("|sed 's/a/b/'"); $f1->print("Hello\n"); $f2->print("abc\n"); $f1->close; $f2->close; これはちゃんと動きます. で close を逆にすると出力も逆順にな ります. バッファリングしてるからなんですね. close の前に $f1->flush; を入れると正順になるし. ruby は出力先が pipe でもバッファリングされないんですか? 昨今の CGI ブームを見るとそのほうが混乱がなくていい気もするけど. -- わたなべひろふみ