我有一个简单的端口应用程序(字面意思是来自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}}
答案 0 :(得分:2)
从使用GenServer
的模块打开端口时,请确保在Port.open
函数中调用init
而不是start
或start_link
函数。 init
由新流程运行,其中start
和start_link
仍然是调用流程。
以下是使用端口的GenServer
示例: