我有一个外部exe程序,它从stdin读取并产生结果。它的工作方式与wc
程序类似,直到EOF才会读取。 (或者说End of Stream,而不是。)
更新:让我再补充一点解释:我基本上是想写一个Erlang管道。
我可以在echo 339371249625 | LookupProj.exe
之类的批处理文件中调用该程序,但我希望能够从Erlang gen_server
传递数据。
我看过Erlang Ports,但是我很难让他们玩得很开心。这就是我所拥有的:
test(InputText) ->
P = open_port({spawn, "/ExternEvent/LookupProj.exe"}, [stream, exit_status, use_stdio,
stderr_to_stdout, in, out]),
IBin = list_to_binary(InputText),
%% io:format("~p~n",[I2]),
P ! {self(), {command, <<IBin/binary, <<26>>/binary>>}}, %% ASCII 26 = EOF
P ! {self(), {eof}}, %% ERROR -- how to close stdin of the cat process?
receive B -> io:format("~p",[B]) end.
我尝试使用eof
中的open_port
标记来帮助我。 (不确定这是否是正确的旗帜?)
我哪里出错了?谢谢!
答案 0 :(得分:1)
如果我理解正确,您正尝试在多次调用之间重新使用端口连接,例如 echo 339371249625 | LookupProj.exe ,但afaik关闭 stdin 的唯一方法实际上是用port_close/1关闭端口,所以所有这些围绕端口跳舞并不比启动它更好命令os:cmd/1。
如果您可以修改LookupProj.exe,您可以将stdin上的一些预定义字节序列视为命令的结尾,并在每次完成时发送它而不是EOF。