【问题标题】:Port messages returning to an unexpected process端口消息返回意外进程
【发布时间】:2016-08-15 06:58:35
【问题描述】:

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

GenServer 可以与 C 应用程序正常通信,但它不会收到响应,iex 或其主管会收到响应。如果我从 iex 调用 flush,我会看到预期的消息。

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

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

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

【问题讨论】:

    标签: elixir erlang-ports


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多