如果給定兩個鏈接進程child
和parent
,進程child
如何檢測到parent
正常退出(終止)?進程正常退出
作爲一名絕對的Erlang初學者,我認爲一個過程在沒有其他事情的情況下使用exit(normal)
退出。然後,這標誌着所有鏈接的過程,其中
- 的具有
trap_exit
設置爲false
過程的行爲是忽略該信號,並 - 的具有進程的行爲
trap_exit
集到true
是生成消息{'EXIT', pid, normal}
其中pid
是終止進程的進程標識。
我認爲這是Learn You Some Erlang for Great Good和Erlang documentation其中說明以下內容的理由。
如果退出原因是原子正常,則稱進程正常終止。沒有更多代碼執行的進程正常終止。
顯然是錯誤的(?),因爲exit(normal
)顯示命令提示符** exception exit: normal
,使下面工作的代碼。正在退出,因爲沒有更多的代碼要執行不會生成異常,並且不會使我的代碼正常工作。
作爲示例,請考慮以下代碼。
-module(test).
-export([start/0,test/0]).
start() ->
io:format("Parent (~p): started!\n",[self()]),
P = spawn_link(?MODULE,test,[]),
io:format(
"Parent (~p): child ~p spawned. Waiting for 5 seconds\n",[self(),P]),
timer:sleep(5000),
io:format("Parent (~p): dies out of boredom\n",[self()]),
ok.
test() ->
io:format("Child (~p): I'm... alive!\n",[self()]),
process_flag(trap_exit, true),
loop().
loop() ->
receive
Q = {'EXIT',_,_} ->
io:format("Child process died together with parent (~p)\n",[Q]);
Q ->
io:format("Something else happened... (~p)\n",[Q])
after
2000 -> io:format("Child (~p): still alive...\n", [self()]), loop()
end.
這產生如下輸出。
([email protected])> test:start().
Parent (<0.145.0>): started!
Parent (<0.145.0>): child <0.176.0> spawned. Waiting for 5 seconds
Child (<0.176.0>): I'm... alive!
Child (<0.176.0>): still alive...
Child (<0.176.0>): still alive...
Parent (<0.145.0>): dies out of boredom
ok
([email protected])10> Child (<0.176.0>): still alive...
Child (<0.176.0>): still alive...
Child (<0.176.0>): still alive...
Child (<0.176.0>): still alive...
Child (<0.176.0>): still alive...
Child (<0.176.0>): still alive...
Child (<0.176.0>): still alive...
exit(pid(0,176,0),something).
Child process died together with parent ({'EXIT',<0.194.0>,something})
如果必須手動執行exit(pid(0,176,0),something)
命令以防止孩子永遠活着。 在start
更改ok.
到exit(normal)
使執行這樣下去
([email protected])3> test:start().
Parent (<0.88.0>): started!
Parent (<0.88.0>): child <0.114.0> spawned. Waiting for 5 seconds
Child (<0.114.0>): I'm... alive!
Child (<0.114.0>): still alive...
Child (<0.114.0>): still alive...
Parent (<0.88.0>): dies out of boredom
Child process died together with parent ({'EXIT',<0.88.0>,normal})
** exception exit: normal
我的具體問題有以下幾種。
- 如何使上述代碼按預期工作。也就是說,如何在不更改父進程的情況下確保子進程與父進程一起死亡?
- 爲什麼
exit(normal)
在CLI中生成** exception exit: normal
?我很難將異常看作是正常的事情。 Erlang文檔中的情節是什麼意思?
我認爲這些必須是非常基本的問題,但我似乎無法弄清楚這一點.... 我在Windows(x64)上使用Erlang 5.9.3.1。
我明白了。感謝您的明確解釋。建議的解決方案有效。我真的不明白爲什麼shell會以這種方式工作,但這只是我想的方式;)。 – Semafoor
這是erlang的方式;) –