端口消息返回到意外进程

时间:2016-04-21 21:00:15

标签: elixir erlang-ports

我有一个简单的端口应用程序(字面意思是来自Erlang -- Ports documentation的示例)和一个控制其使用的GenServer。

GenServer可以很好地与C应用程序通信,但它没有收到响应,iex或其主管。如果我从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 ,我会看到预期的消息。

如果我创建一个单独的模块并从中生成一个接收循环,它仍然不会收到端口响应消息。

我有一种感觉,我错误地打开了港口,但无法证明这一点。我有什么明显的搞砸了吗?

{{1}}

1 个答案:

答案 0 :(得分:2)

从使用GenServer的模块打开端口时,请确保在Port.open函数中调用init而不是startstart_link函数。 init由新流程运行,其中startstart_link仍然是调用流程。

以下是使用端口的GenServer示例:

library