如何确定进程父进程的 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的主要内容,如果未能解决你的问题,请参考以下文章

如果父进程仍在运行,子进程的 PID 是不是可供重用?

ps命令查看父进程及线程

如何知道 vfork 函数中的父进程或子进程

linux kill 关闭进程命令

进程管理

fork子进程之间传输信息的方法(包含子进程与子进程之间区分的问题的解决)