16

我在 erlang 中有一个进程,它应该在生成后立即执行某些操作,然后在完成后将结果发送回父级。如何找出产生它的进程的PID?

4

4 回答 4

15

您应该将 self() 作为入口函数的参数之一传递给孩子。

spawn_link(?MODULE, child, [self()]).
于 2008-08-07T02:27:32.740 回答
4

@Eridius 的回答是首选的方法。要求进程注册名称可能会产生意想不到的副作用,例如增加进程的可见性,更不用说当您有很多进程时想出唯一名称的麻烦。

于 2008-09-16T14:35:32.210 回答
4

最好的方法肯定是将它作为参数传递给调用的函数以启动子进程。如果您正在产生乐趣,这通常是一件好事,请小心执行以下操作:

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

这不会按照您的预期进行。(提示:何时调用 self())

一般来说,您应该避免注册一个进程,即给它一个全局名称,除非您真的希望它是全局已知的。Spawning a fun 意味着您不必导出生成的函数,因为您通常应该避免导出不打算从其他模块调用的函数。

于 2009-08-11T16:19:38.740 回答
0

您可以使用 BIF 寄存器为生成/父进程命名(一个原子),然后从其他进程中引用已注册的名称。

函数()->

%% 做点什么
%% 然后发送消息给父母
父母!信息。

...

注册(父母,自我()),
产卵(模块,功能,[ARGS])。

请参阅Erlang 入门第 3.3 节和Erlang 参考手册第 10.3 节

于 2008-08-07T03:57:04.993 回答