Erlang:当一切正常关闭时,spawn_link进程不会被杀死

时间:2016-03-27 09:30:58

标签: erlang exit spawn

模块测试:

tester() ->
    receive
        X -> 
            erlang:display("message.."),
            tester()
    end.


initialize() ->
    spawn_link(?MODULE, tester, []),
    erlang:display("Started successfully.").

REPL:

length(erlang:processes()). -> 23
Pid = spawn_link(test, initialize, []).
length(erlang:processes()). -> 24
exit(Pid).
length(erlang:processes()). -> 24

似乎生成的测试程序进程仍在运行!我如何确保当我退出我的应用程序时,所有spawn_link进程都会被杀死?

1 个答案:

答案 0 :(得分:4)

嗯,你实际上是在启动两个Erlang进程,而不是一个。您发送exit信号的第一个信号在您发送退出信号之前就会消失,因此exit无效。

你在这一行的shell中开始的第一个过程:

Pid = spawn_link(test, initialize, []).

此过程开始执行initialize函数,在该函数中,它启动第二个进程,然后它就会死掉,因为没有别的事可做。这是您尝试发送exit信号的过程。

要解决此问题,只需从initialize函数返回正确的Pid

initialize() ->
    Pid = spawn_link(?MODULE, tester, []),
    erlang:display("Started successfully."),
    Pid.

直接启动:

Pid2 = test:initialize().

然后你可以用exit(Pid2).

杀死它