模块测试:
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进程都会被杀死?
答案 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).