« FreeBSDでルータ | トップページ | Twitter、ついに公式でReTweet実装の方向か・・・。 »

ソースを追っかけること。

今日、お仕事でのこと。
「perlのsystem()の挙動がバージョンで違う」って話になって。
せっかくなので、このあたりからソース落としてきて、ちょちょいと調べてみました。ちなみに処理系はLinux。

perlのsystem関数は、pp_sys.c の PP(pp_system) のところで定義してます。
そこでforkして、doio.c の Perl_do_aexec5 または Perl_do_exec3 を呼んでいます。
つまり、forkしてexecl/execv のお約束の流れです。
そして、親プロセスはwaitpidしてます。追っかければわかりますが、これをやってるのが、 util.c の Perl_wait4pid 。
実際にwaitpidしてるところを引用してみます。
●5.7.2のソース

  return PerlProc_waitpid(pid,statusp,flags);

●5.8.0のソース
  result = PerlProc_waitpid(pid,statusp,flags);
goto finish;
/* 中略 */
finish:
if (result < 0 && errno == EINTR) {
PERL_ASYNC_CHECK();
}
return result;

処理が変わってます。ちなみにPerlProc_waitpid は #define で waitpid となってます。(これもソースを追っかければわかります)
そして、PERL_ASYNC_CHECK() は、perl.h にあるように、
#define PERL_ASYNC_CHECK() if (PL_sig_pending) despatch_signals()

(注意:一部だけ引っこ抜き。プリプロセッサの#ifdef とかにはさまれてます。)
というかんじになってます。ちなみに、despatch_signals は、mg.c を参照。これも追っかければわかります。

実はまだ、これが解答じゃなくて、まだ調査中ですけどねー。

まあ、こんなかんじで、ちょちょいと追っかけてました。
参考:(オチ)


・・・何が言いたかったかというと。
ソース追っかけるって重要だよねってこと。
ちなみに、前職ではMFCも追っかけたことがありました。

|

« FreeBSDでルータ | トップページ | Twitter、ついに公式でReTweet実装の方向か・・・。 »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1051972/30464783

この記事へのトラックバック一覧です: ソースを追っかけること。:

« FreeBSDでルータ | トップページ | Twitter、ついに公式でReTweet実装の方向か・・・。 »