Perlの $0の変更に関するメモ
少し前に kfreebsdで $0を変更しても psの結果に反映されない
ことについて調べたのでメモ。
ソースコード
https://github.com/mirrors/perl/blob/blead/mg.c#L2981
mg.cの Perl_magic_set関数の switch文の case '0'の部分です。
処理の流れ
以下のいずれかを実行する
- setproctitle関数を呼ぶ
BSD系のOSで実装される関数
- pstat(command: PSTAT_SETCMD)システムコールを呼ぶ
- argv[0]を書き換える
setproctitle, pstatが実装されていない場合。
- prctl(command: PR_SET_NAME)システムコール呼ぶ
Linuxで実装されるシステムコール。よくわからないがこのときは
argv[0]の書き換えも実行される。
kfreebsdはカーネルが FreeBSD、ユーザランドが Debian GNU/Linuxと
いう構成なので、setproctitleも prctlも実装されておらず、さらに
argv[0]の書き換えも意味がないということで、$0の変更が psの結果に反映
されなかったようです。
kfreebsdはこのあたりのインタフェースの扱いをどうするんでしょうかね。
これから実装するんでしょうかね?一応 Debianに libbsdという、
BSDユーティリティを実装したライブラリがあるんですが、結構未実装
なのでまだ使えなさそうな感じです。