[Momonga-devel.ja:00759] Re: merging gcc3 to HEAD (Re: GCC3 の今後)
- From: Junichiro Kita <kita@xxxxxxxxxxxxxxx>
- Date: Sun, 10 Nov 2002 12:57:07 +0900
きたです.
>> しかし、こういうの、どのドキュメントに書いてあります?
>
>$ 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