Erlang Ports:与“wc”式程序接口?

时间:2012-01-09 17:16:58

标签: erlang cgi

我有一个外部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标记来帮助我。 (不确定这是否是正确的旗帜?)

我哪里出错了?谢谢!

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您正尝试在多次调用之间重新使用端口连接,例如 echo 339371249625 | LookupProj.exe ,但afaik关闭 stdin 的唯一方法实际上是用port_close/1关闭端口,所以所有这些围绕端口跳舞并不比启动它更好命令os:cmd/1

如果您可以修改LookupProj.exe,您可以将stdin上的一些预定义字节序列视为命令的结尾,并在每次完成时发送它而不是EOF。