2016-03-27 6 views
1

モジュールのテストをシャットダウンするとspawn_linkプロセスが殺されていません。アーラン:すべてが正常に

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

でそれを殺すことができるようになります

Pid2 = test:initialize(). 

を:

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

そして、それを直接起動します。単に初期化関数から正しいPidを返すこの問題を解決するには

exit(Pid) 'は' test:initialize/0'を実行しているプロセスがほとんど瞬時に戻るため実際には失敗します。それは意図的なのでしょうか? – Dogbert

答えて

4

まあ、あなたは実際には2つのErlangプロセスを起動しています。 exit信号を送信している最初の信号は、終了信号を送信する前に停止しているので、exitは何の効果もありません。

あなたがこの行にシェルで起動する最初のプロセス:

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

このプロセスは、第2のプロセスを開始するinitialize機能を、実行を開始し、実行する他には何もありませんので、それは死にます。これは、exit信号を送信しようとしているプロセスです。そして、あなたは `exit(Pid2).

+0

私は今理解していますが、spawn_linkは双方向ですので、初期化プロセスが終了するとテスタープロセスも終了するはずです。しかし、そうではありません。そして、どうすればいいの? –

+0

最初のプロセスは強制終了されません。実行するコードがなくなるため、終了シグナルを送信する前に終了します。その理由のためにプロセスが終了すると、プロセスが正常に終了すると言われ、プロセス間のリンクが他のプロセスを停止させることはありません。 http://erlang.org/doc/reference_manual/processes.html#id86927でexitシグナルを受け取るを参照してください。あなたはinitialize関数の最後に 'exit(something).'を追加することができます。そうすれば、プロセスは正常に終了せず、リンクされたプロセスもそれで終了します。 – Amiramix

+0

私は、ありがとう! –

関連する問題