« 2009年6月 | トップページ | 2009年8月 »

2009年7月

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

今日、お仕事でのこと。
「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も追っかけたことがありました。

| | コメント (0) | トラックバック (0)

FreeBSDでルータ

これ、もう1枚NICを手に入れてから着手する。そのためのメモ。
FreeBSD 5.3 で NIC 2枚差しPCルーター
うちはPPPoEじゃなくてDHCPできてるので、設定が違ってくるけど、tun0→もう1つのnicデバイス、程度の違いかな。

|

« 2009年6月 | トップページ | 2009年8月 »