如何确定进程父进程的 PID
Posted
技术标签:
【中文标题】如何确定进程父进程的 PID【英文标题】:How Do You Determine The PID of the Parent of a Process 【发布时间】:2010-09-05 11:31:12 【问题描述】:我在 erlang 中有一个进程,它应该在生成后立即执行某些操作,然后在完成后将结果发送回父级。如何找出产生它的进程的 PID?
【问题讨论】:
对于使用proc_lib
的OTP和其他进程,请参阅How to find the supervisor of an OTP process?
【参考方案1】:
最好的方法肯定是将它作为参数传递给调用的函数以启动子进程。如果您正在产生乐趣,这通常是一件好事,请小心这样做:
spawn_link(fun () -> child(self()) end)
这不会按您的预期进行。 (提示:self() 何时被调用)
通常你应该避免注册一个进程,即给它一个全局名称,除非你真的希望它是全局已知的。生成一个有趣的函数意味着您不必导出生成的函数,因为您通常应该避免导出不打算从其他模块调用的函数。
【讨论】:
【参考方案2】:@Eridius 的回答是首选方法。要求进程注册名称可能会产生意想不到的副作用,例如增加进程的可见性,更不用说在有很多进程时想出唯一名称的麻烦。
【讨论】:
【参考方案3】:您可以使用 BIF 寄存器为生成/父进程命名(一个原子),然后从其他进程中引用已注册的名称。
FUNC() ->
%% 做点什么 %% 然后发送消息给父母 家长!消息。
...
注册(父母,自我()), 生成(模块,功能,[ARGS])。
请参阅 Getting Started With Erlang §3.3 和 The Erlang Reference Manual §10.3。
【讨论】:
虽然你可以通过注册一个名字来做到这一点,但这根本不是一个好主意。如果您积极劝阻并解释问题,这篇文章会更好。 回到私人测试版(这个问题可以追溯到私人测试版开始后大约一周),该网站的讨论方面并不是非常好的。我真的不想发表意见,只是陈述一种替代方法。我认为其他答案/帖子中已充分解决了利弊。【参考方案4】:您应该将 self() 作为入口函数的参数之一传递给孩子。
spawn_link(?MODULE, child, [self()]).
【讨论】:
以上是关于如何确定进程父进程的 PID的主要内容,如果未能解决你的问题,请参考以下文章