端口消息返回到意外进程
Port messages returning to an unexpected process
我有一个简单的 ports 应用程序(字面意思是 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
从使用 GenServer
的模块打开端口时,确保您在 init
函数中调用 Port.open
而不是 start
或 start_link
职能。 init
是新进程的 运行,其中 start
和 start_link
仍然是调用进程。
这是使用端口的 GenServer
示例:
https://github.com/fhunleth/elixir_ale/blob/master/lib/i2c.ex
我有一个简单的 ports 应用程序(字面意思是 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
从使用 GenServer
的模块打开端口时,确保您在 init
函数中调用 Port.open
而不是 start
或 start_link
职能。 init
是新进程的 运行,其中 start
和 start_link
仍然是调用进程。
这是使用端口的 GenServer
示例:
https://github.com/fhunleth/elixir_ale/blob/master/lib/i2c.ex