struggling with port_command()
Gregory Haskins
gregory.haskins@REDACTED
Thu Oct 21 22:39:06 CEST 2010
Hi All,
I've been struggling all afternoon with what is perhaps a completely trivial problem, but I can't seem to get past it.
Ultimately, I want to be able to have a simple external port program transform a string (XML, in fact, but that shouldn't matter). So I want to have my erlang program pump a string in on stdin, and then get a string back out on stdout. Simple stuff, but it just will not work for me.
I scoured the net for examples and/or threads on problems in doing this, but was unable to figure out what I am doing wrong. Here is an escript which exemplifies the issue:
#!/usr/bin/env escript
pipe_stdin(Port) ->
case io:get_line("") of
eof ->
%port_close(Port),
ok;
Data ->
true = port_command(Port, Data),
pipe_stdin(Port)
end.
main([Cmd]) ->
io:format("Executing ~s~n", [Cmd]),
Port = erlang:open_port({spawn, Cmd}, [stream, use_stdio, exit_status]),
ok = pipe_stdin(Port),
{ok, _Status, Output} = cmd_receive(Port, ""),
io:format("-----~s~n", [Output]),
ok.
cmd_receive(Port, Acc) ->
receive
{Port, {data, Data}} ->
cmd_receive(Port, string:concat(Acc, Data));
{Port, {exit_status, Status}} ->
{ok, Status, Acc};
Else ->
throw({unexpected_msg, Else})
end.
The problem I am seeing is that the data never seems to reach the port program (with or without the port_close()). I pump the data in with port_command() and it returns "true" but nothing seems to come out the other side. Any help would be greatly appreciated.
-Greg
PS: As a secondary question, is the right way to signal EOF on the stdin to the port to use port_close()?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: PGP.sig
Type: application/pgp-signature
Size: 203 bytes
Desc: This is a digitally signed message part
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20101021/6a815be9/attachment.bin>
More information about the erlang-questions
mailing list