2012-01-09 41 views
4

我有一个外部exe程序从stdin读取并产生结果。它的工作方式与wc程序相同,并读取到EOF。 (或流的结束,而宁愿)。Erlang Ports:与类似“wc”程序的接口?

更新:让我再添加一个解释:我基本上试图编写一个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

如果我理解正确,您正试图重复使用几个呼叫之间的端口连接,如echo 339371249625 | LookupProj.exe,但afaik关闭stdin的唯一方法实际上是关闭与port_close/1端口,所以这些围绕端口跳舞并不比启动该命令与os:cmd/1更好。

如果你可以修改LookupProj.exe你想要做考虑在标准输入一些预定义的字节序列作为命令的结束,只是每次你做,而不是EOF时间发送。