2015-12 << 2016-01 >> 2016-02

2016-01-14 (木)

* [Erlang] initial_call

Erlangシェルの i(). でプロセス一覧を表示したとき,initial_callのモジュールを見れば何のプロセスか推測できますが,この文字列どこから取ってきているのか知らなかったので調べた.

最初はprocess_infoで取ってるだけかと思ってたのですが, process_info(Pid, initial_call) で取ると,proc_libばかりになってしまう.gen_serverとかもここから起動されるので当たり前なのだけど.

proc_libのソースを見ると,プロセス辞書の$initial_callというのを書き込んでいて,それが怪しい.これは,proc_lib:translate_initial_call/1 で取れます.ただし,プロセス辞書に何もなければ proc_lib:init_p/5 を返すので,適当なプロセス渡すと嘘が返ってくる.最初に,process_infoで調べて,proc_lib のプロセスだったら translate_initial_call を呼べということらしい.

Erlangシェルの i(). の実装もまさしくそうなっていた.Erlangシェルの関数何処で定義されてるのか分からずTwitterに書いてたら教えてもらえた.

c.erl とか i とかgrepで見つけにくい...

2015-12 << 2016-01 >> 2016-02