From: SATOH Fumiyasu Date: 2008-03-18T19:26:11+09:00 Subject: [ruby-list:44790] Re: $stdin.rewind が exec した子プロセスに伝わらない? さとうふみやす @ OSS テクノロジです。 おつきあいいただき、ありがとうございます。 At Tue, 18 Mar 2008 18:58:13 +0900, Kazuhiro NISHIYAMA wrote: > > シェルを介したくないんですが、IO.popen でできましたっけ? > > "-"でpopenしてexecでできそうです。 なるほど。Perl と一緒ですね。(ちょっと違うか?) use IO::File; my $fh = IO::File->new; my $pid = $fh->open('-|'); > > system([cmd, cmd], args) > > 普通は複数引数のsystemの方が簡単に安全になるので、 > 私も普通は複数引数を使っています。 > > argv[0]をわざわざ指定したいことはあまりないので、 > そこは違いますが。 引数がない場合は system([cmd, cmd]) とするしかない(?)し、 ある場合とで使い分けるのが嫌なので、私は常に指定しますね。 (さすがに 1-liner とかではしませんが) > > 我ながらうまく書けた (自画自賛 :-) と思っているんですが、 > > ダメ出しあるなら頂けると嬉しいです。> all > > ダメ出しというより好みの問題に近いですが、Process.forkは > ブロック付きの方が子プロセスはここだけ、という感じがするし、 なるほど。そのほうがいいと思うので、今後はそうすることにします。 > exit!を忘れてもブロックから抜けることがないので便利です。 ちなみに、先の引用元のプログラムは、失敗したときは exit! で 死なないと駄目な理由があります。 > exit!(1)は失敗という意味だけでいいのならexit!(false)という > のもあります。 exit!(false) でプロセスの終了コードが 0 以外になることが 保証がされているなら、そのほうがいいかもしれませんね。 > unless stdout_reader_th.join(@timeout)というのは > スレッドをnilかfalseを返す可能性がある実装に変えて > しまうとはまりそう、と思ってしまいました。 `ri Thread#join` によると: ------------------------------------------------------------ Thread#join thr.join => thr thr.join(limit) => thr ------------------------------------------------------------------------ The calling thread will suspend execution and run thr. Does not return until thr exits or until limit seconds have passed. If the time limit expires, nil will be returned, otherwise thr is returned. ... なので、タイムアウト時に nil、それ以外はスレッドオブジェクトが 返ると思っていたのですが、マニュアルが間違っていますか? -- -- Name: SATOH Fumiyasu (fumiyas @ osstech co jp) -- Business Home: http://www.OSSTech.co.jp/ -- Personal Home: http://www.SFO.jp/blog/