Erlang:spawn_链接进程不会在所有进程正常关闭时被终止
模块测试:Erlang:spawn_链接进程不会在所有进程正常关闭时被终止,erlang,exit,spawn,Erlang,Exit,Spawn,模块测试: tester() -> receive X -> erlang:display("message.."), tester() end. initialize() -> spawn_link(?MODULE, tester, []), erlang:display("Started successfully."). 答复: 生成的测试程序进程似乎仍在运行!如何确保在
tester() ->
receive
X ->
erlang:display("message.."),
tester()
end.
initialize() ->
spawn_link(?MODULE, tester, []),
erlang:display("Started successfully.").
答复:
生成的测试程序进程似乎仍在运行!如何确保在退出应用程序时,所有spawn\u link进程也被终止?实际上,您正在启动两个Erlang进程,而不是一个。您向其发送
退出
信号的第一个信号在您发送退出信号之前就消失了,因此退出
无效
在这一行的shell中启动的第一个进程:
Pid = spawn_link(test, initialize, []).
此进程开始执行initialize
函数,在该函数中,它启动第二个进程,然后由于没有其他事情要做而终止。这是您试图向其发送退出信号的过程
要解决此问题,只需从initialize函数返回正确的Pid
:
initialize() ->
Pid = spawn_link(?MODULE, tester, []),
erlang:display("Started successfully."),
Pid.
直接启动:
Pid2 = test:initialize().
然后您将能够使用退出(Pid2)终止它。实际上,您正在启动两个Erlang进程,而不是一个。您向其发送
退出
信号的第一个信号在您发送退出信号之前就消失了,因此退出
无效
在这一行的shell中启动的第一个进程:
Pid = spawn_link(test, initialize, []).
此进程开始执行initialize
函数,在该函数中,它启动第二个进程,然后由于没有其他事情要做而终止。这是您试图向其发送退出信号的过程
要解决此问题,只需从initialize函数返回正确的Pid
:
initialize() ->
Pid = spawn_link(?MODULE, tester, []),
erlang:display("Started successfully."),
Pid.
直接启动:
Pid2 = test:initialize().
然后您可以使用退出(Pid2)终止它。
退出(Pid)
实际上会失败,因为运行测试:初始化/0
的进程几乎会立即返回。这是故意的吗?exit(Pid)
实际上会失败,因为运行test:initialize/0
的进程几乎会立即返回。这是故意的吗?我现在明白了,但spawn_链接仍然是双向的,所以当初始化进程被终止时,它也应该终止测试进程。但事实并非如此。我该怎么做呢?第一个进程没有被终止,它在您向它发送退出信号之前就终止了,因为没有更多的代码要执行。当一个进程因为这个原因死亡时,据说它正常退出,因此进程之间的链接不会触发另一个进程死亡。请参阅中的接收退出信号。您可以在初始化函数的末尾添加退出(某物)。。这样,进程将不会正常结束,链接的进程也将随之消亡。我现在理解它了,但spawn_link仍然是双向的,所以当初始化进程被终止时,它也应该终止tester进程。但事实并非如此。我该怎么做呢?第一个进程没有被终止,它在您向它发送退出信号之前就终止了,因为没有更多的代码要执行。当一个进程因为这个原因死亡时,据说它正常退出,因此进程之间的链接不会触发另一个进程死亡。请参阅中的接收退出信号。您可以在初始化函数的末尾添加退出(某物)。。这样,进程将不会正常结束,链接进程将随之消亡。