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

Erlang: spawn_link processes are not killed when everything shuts down normally

模块测试:

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


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

回复:

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

生成的测试进程似乎仍然是运行!我如何确保当我退出我的应用程序时,所有 spawn_link 进程也被终止?

好吧,您实际上是在启动两个 Erlang 进程,而不是一个。您向其发送 exit 信号的第一个在您发送退出信号之前就已死亡,因此 exit 无效。

您在 shell 这一行中启动的第一个进程:

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

这个进程开始执行initialize函数,在这个函数中它启动了第二个进程,然后它死掉了,因为没有别的事可做。这是您要向其发送 exit 信号的进程。

要解决此问题,只需 return 来自初始化函数的正确 Pid

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

并直接启动:

Pid2 = test:initialize().

然后你就可以用exit(Pid2).

杀死它