2012-10-30 100 views
2

當我從learnyousomeerlang.com讀到一篇文章時,我有一個問題。 http://learnyousomeerlang.com/errors-and-processes我可以陷阱退出(self(),kill)嗎?

它說:

異常源:exit(self(), kill)

未捕獲的結果:** exception exit: killed

被困結果:** exception exit: killed

哎呀,看看那個。看起來這個實際上是不可能陷入的。讓我們來檢查一下。

,但它不符合我的代碼的打擊測試:

-module(trapexit). 
    -compile(export_all). 
    self_kill_exit()-> 
    process_flag(trap_exit,true), 
    Pid=spawn_link(fun()->timer:sleep(3000),exit(self(),kill) end), 
    receive 
    {_A,Pid,_B}->io:format("subinmain:~p output:~p~n",[Pid,{_A,Pid,_B}]) 
    end. 

oupput是: ** 4> trapexit:self_kill_exit()。

subinmain:< 0.36.0>輸出:{ '退出',< 0.36.0>,殺死} **

,不與囚禁結果符合:**退出異常:殺害之前說。哪個是對的???

回答

4

在作爲參數傳遞給spawn_link的函數體中調用self不會返回調用spawn_link的進程。它正在新生成的進程中進行評估,因此它將返回其PID。進行以下更改。

-module(trapexit). 
-compile(export_all). 
self_kill_exit()-> 
    process_flag(trap_exit,true), 
    Self=self(), 
    Pid=spawn_link(fun()->timer:sleep(3000),exit(Self,kill) end), 
    receive 
    {_A,Pid,_B}->io:format("subinmain:~p output:~p~n",[Pid,{_A,Pid,_B}]) 
    end. 

現在它應該按預期工作。

10> c(trapexit).    
{ok,trapexit} 
11> trapexit:self_kill_exit(). 
** exception exit: killed 

這本書是正確的。誘捕exit(self(), kill)是不可能的。