2008-08-07 177 views
12

我有一個erlang進程,應該在產生後立即執行某些操作,然後在完成時將結果發送回父進程。我如何找出產生它的過程的PID?如何確定進程的父進程的PID

+0

對於使用`proc_lib`的OTP和其他進程,請參見[如何找到OTP進程的管理器?](http://stackoverflow.com/questions/4132317/how-to-find-the-supervisor-of -an-otp-process) – 2011-05-19 11:30:16

回答

14

您應該將self()傳遞給子項作爲輸入函數的參數之一。

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

您可以使用BIF寄存器爲產卵/父進程指定一個名稱(原子),然後引用其他進程的註冊名稱。

FUNC() - >

%%做一些
%%然後將消息發送到父
父!信息。

...

寄存器(父,自()),
產卵(MODULE,FUNC,[參數])。

請參閱Getting Started With Erlang §3.3The Erlang Reference Manual §10.3

+0

雖然你可以通過註冊一個名字來完成,但它並不是一個好主意。如果您積極勸阻並解釋問題,這篇文章會更好。 – Christian 2009-08-13 11:35:43

4

@Eridius的答案是這樣做的首選方法。要求註冊名稱的過程可能會產生意想不到的副作用,例如增加流程的可見性,更不用說當您擁有大量流程時提供獨特名稱的麻煩。

3

最好的方法是將它作爲參數傳遞給被調用的函數以啓動子進程。如果您正在產卵的玩意兒,這通常是一個很好的事情,要小心這樣做的:

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

如你預期它不會做。 (提示:什麼時候自己()被調用)

一般來說,你應該避免註冊一個進程,即給它一個全局名稱,除非你真的希望全局知道它。產生趣味意味着你不必導出衍生函數,因爲通常應該避免導出不意味着從其他模塊調用的函數。