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进程。但事实并非如此。我该怎么做呢?第一个进程没有被终止,它在您向它发送退出信号之前就终止了,因为没有更多的代码要执行。当一个进程因为这个原因死亡时,据说它正常退出,因此进程之间的链接不会触发另一个进程死亡。请参阅中的接收退出信号。您可以在初始化函数的末尾添加退出(某物)。。这样,进程将不会正常结束,链接进程将随之消亡。