[Momonga-devel.ja:00759] Re: merging gcc3 to HEAD (Re: GCC3 の今後)


きたです.

>> しかし、こういうの、どのドキュメントに書いてあります?
>
>$ refe Kernel\#open かな。
>closeするとあって、waitする、とはないけど。

確かにないですねぇ.
どこで知ったんだったかな.むかーし ruby-list でそういうネタが出たのかも.
このネタ,Rubyの落とし穴
http://www.ruby-lang.org/ja/man-1.6/?cmd=view;name=Ruby%A4%CE%CD%EE%A4%C8%A4%B7%B7%EA
にあっても良いような.

>私の敗因は、
>"open(...).each と書いたくせに、イテレータを使った呼び出しのつもりでいた"
>ことです。
>
>にもかかわらず、それが <defunct>を産むものだから、ドキュメント通りになってな
>いじゃん、と思いつつtrapしていたという間抜けな話でした。

ふふふふ.
たしかに open(...).each と書くとぱっと見 open にブロックを渡してるような
気がしますね.


ちなみに 1.6.7 のソースを見てみたら io.c の 1706 行目,rb_io_popen() の
最後の方で

    if (rb_block_given_p()) {
        return rb_ensure(rb_yield, port, rb_io_close, port);
    }

としている個所がありました.
文面から判断するに,ブロックが与えられていたら最後に確実に rb_io_close() 
を実行するみたいですね.
で,rb_io_close() を見てみたら 1067 行で

    if (fptr->pid) {
        rb_syswait(fptr->pid);
        fptr->pid = 0;
    }

ちゃんと wait していることが分かります.

うーん,これでスッキリ.

-- 
Junichiro Kita mailto:kita@xxxxxxxxxxxxxxx