2008-08-07 3 views
12

私は、産んだ直後に何かをやろうとしているプロセスをerlangに持っていて、終了時に結果を親に返します。どのように私はそれを産んだプロセスのPIDを把握するのですか?プロセスの親のPIDを決める方法

+0

'proc_lib'を使ったOTPやその他のプロセスについては、[OTPプロセスの管理者を探す方法は?](http://stackoverflow.com/questions/4132317/how-to-find-the-supervisor-of -an-otp-process) –

答えて

14

entry関数の引数の1つとして、子にself()を渡す必要があります。

spawn_link(?MODULE, child, [self()]). 
0

あなたは、その後、他のプロセスから戻って登録された名前を参照してください産卵/親プロセスに名前(原子)を得レジスタのBIFを使用することができます。

FUNC() - >

は親
親にメッセージを送る次に何か
%%を行い%%!メッセージ。

...

レジスタ(親、自己())、
スポーン(MODULE、FUNC、[ARGS])。

Getting Started With Erlang §3.3およびThe Erlang Reference Manual §10.3を参照してください。

+0

あなたは名前を登録することでそれを行うことができますが、それは全くいいことではありません。この投稿は、あなたが積極的にそれをして落胆し、問題を説明した方が良いでしょう。 – Christian

+1

プライベートベータ版(この質問はプライベートベータの開始から約1週間後に戻っています)では、サイトの議論面はあまりうまく成立していませんでした。私は本当に意見を述べることを望んでおらず、代わりの方法を述べるだけです。私は賛否両論が他の回答/投稿で適切に対処されていると思う。 –

4

@Eridiusの回答はそれを行うのに好ましい方法です。プロセスに名前を登録するよう要求すると、プロセスの可視性が向上するなど、意図しない副作用が生じる可能性があります。

3

子プロセスを開始するために呼び出される関数の引数として渡すことをお勧めします。あなたが一般的に行うには良いことです低速運行を、産卵している場合は、やって注意してください:あなたが意図したとおりにしないだろう

spawn_link(fun() -> child(self()) end) 

。 (ヒント:self()が呼び出されたとき)

一般的に、プロセスを登録することは避けてください。面白いことを生み出すということは、他のモジュールから呼び出されることを意図していない関数を一般的にエクスポートしないように、生成された関数をエクスポートする必要がないことを意味します。

関連する問題