[erlang-questions] Newbie: half-closing a port?

Evan Miller emmiller@REDACTED
Sat Feb 2 22:40:01 CET 2008


After poring over the list archives for a while, I cannot find a way to 
do the following fairly simple operation:

1. Open a port
2. Send data to the port
3. Close the writing file descriptor
4. Read data from the port
5. Close the port

My external program is a standard Unix utility that will not print data 
until it has read to the end of the input (i.e. the writer has closed 
its FD). If I close the port entirely, the external program gets a 
SIGPIPE when it attempts to flush its buffers. The following shell 
session demonstrates my problem:


22> Port = open_port({spawn, "sed 's/foo/bar/'"}, []).
#Port<0.104>
23> Port ! {self(), {command, "foo\n"}}.
{<0.56.0>,{command,"foo\n"}}
24> flush(). % still waiting for output...
ok
25> Port ! {self(), close}.
{<0.56.0>,close}
26> sed: couldn't flush stdout: Broken pipe

26>

I would like to be able to do something like this just before closing:

Port ! {self(), eof}.
% read output...

Is anything like this possible?

Thanks,

Evan Miller




More information about the erlang-questions mailing list