我们如何确定流程父级的PID
时间:2020-03-05 18:38:13 来源:igfitidea点击:
我在erlang中有一个进程,应该在产卵后立即执行某些操作,然后在完成后将结果发送回父进程。我如何找出产生它的过程的PID?
解决方案
回答
我们应该将self()作为入口函数的参数之一传递给孩子。
spawn_link(?MODULE, child, [self()]).
回答
我们可以使用BIF寄存器为生成/父进程指定一个名称(原子),然后从其他进程中引用回已注册的名称。
FUNC() -> %% Do something %% Then send message to parent parent ! MESSAGE.
...
注册(父母,self()),
生成(MODULE,FUNC,[ARGS])。
请参阅《 Erlang 3.3入门》和《 Erlang参考手册》 10.3.
回答
@Eridius的答案是首选方法。要求一个过程来注册一个名称可能会产生意想不到的副作用,例如增加过程的可见性,更不用说当我们有很多过程时要提出唯一名称的麻烦。
回答
最好的方法肯定是将其作为参数传递给启动子进程的函数。如果我们要产生乐趣,通常这是一件好事,请注意以下事项:
spawn_link(fun () -> child(self()) end)
这不会达到预期。 (提示:何时调用self())
通常,除非我们确实希望它是全球知名的,否则应该避免注册一个进程,即为它指定一个全局名称。产生乐趣意味着我们不必导出生成的函数,因为通常应避免导出本来不是要从其他模块调用的函数。