From: nobu@... Date: 2004-12-21T18:50:40+09:00 Subject: [ruby-dev:25268] Re: 1.8 reopen problem with duplex popen なかだです。 At Tue, 21 Dec 2004 12:47:12 +0900, Tanaka Akira wrote in [ruby-dev:25266]: > >> > そういえば、ここで fclose してますけど、popen だった場合も fclose でい > >> > いんでしょうか? > >> > >> popen(3)を使うのは、djgpp, human68k, VMSでしたっけ? VMSは分かり > >> ませんが、djgppあたりだと一時ファイルを消したりする処理が入るん > >> でしょうか。 > > > > djgppの場合、popenで"r"のときはそうですが、popenで"w"のとき > > はpcloseでやっとプロセスが起き始めます。 > > そういえば、pclose はプロセスの終了を待つ効果がありますが、ここではプ > ロセスを待ちませんね。 たしかに。 > 試してみると、 > > % ./ruby -e 'io = IO.popen("sleep 3"); p 1; io.reopen("/dev/null"); p 2; io.close; p 3' > 1 > 2 > (ここで 3秒待つ) > 3 > > というように close 時に待つならそれはそれでひとつの立場ではあるか、と > も思ったりしますが、 > > % ./ruby -e 'io = IO.popen("sleep 3"); p 1; io.reopen(IO.popen("echo")); p 2; io.close; p 3' > 1 > 2 > 3 > > という場合には sleep 3 を待つ所はなくなってしまうようで。 closeで待つというのも何か違うような気がしますが、考えられる動作 としては、こんなところでしょうか。 1. 元のプロセスを無視して新しいプロセスを対象にする 元のプロセスは 1-1. defunctになっても気にしない 1-2. Process.detachする 2. 元のプロセスを保持 3. reopenでwait 3-1. closeして終了を待つ 3-2. シグナルを送る 現状では、Stringに対しては2、IOに対しては1-1ですが。 -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦