ソースを追っかけること。
今日、お仕事でのこと。
「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 を参照。これも追っかければわかります。
実はまだ、これが解答じゃなくて、まだ調査中ですけどねー。
まあ、こんなかんじで、ちょちょいと追っかけてました。
参考:1、2、3(オチ)
・・・何が言いたかったかというと。
ソース追っかけるって重要だよねってこと。
ちなみに、前職ではMFCも追っかけたことがありました。
| 固定リンク
この記事へのコメントは終了しました。
コメント