0

我有一个简单的端口应用程序(字面意思是Erlang -- Ports 文档中的示例)和一个控制其使用的 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
4

1 回答 1

2

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

下面是一个GenServer使用端口的示例:

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

于 2016-04-22T02:50:07.047 回答