2016-04-21 8 views
0

私は単純なポートアプリケーション(文字通りErlang -- Ports documentationの例)とその使用を制御するGenServerを持っています。予期しないプロセスに戻るポートメッセージ

GenServerはCアプリケーションと通信することはできますが、iexまたはそのスーパーバイザは応答を受信しません。私がflushをiexから呼び出すと、予想されるメッセージが表示されます。

別のモジュールを作成してそれから受信ループを起動すると、それでもポート応答メッセージは受信されません。

私はポートを間違って開いていると感じましたが、それを証明することはできません。私が悩んでいることは明らかですか?

port = Port.open({:spawn, "./extprg"}, [{:packet, 2}, :exit_status]) 
collect = fun() -> collect_results(port) end 
spawn(collect) 


def collect_results(port) do 
    receive do 
     {^port, {:data, data}} -> 
      #never gets called despite matching messages in flush 
     {^port, {:exit_status, status}} -> 
      #never gets called... 

     {:increment, value} -> 
      Port.command(port, [1, value]) 
      collect_results(port) 
    end 
end 

答えて

2

GenServerを使用するモジュールからのポートを開く、あなたはstartまたはstart_link機能init機能でPort.openを呼び出していないことを確認します。 initは新しいプロセスによって実行されます。startstart_linkの両方が依然として呼び出しプロセスです。ここ

ポートを使用GenServerの例である:

https://github.com/fhunleth/elixir_ale/blob/master/lib/i2c.ex