[erlang-questions] Issues with stdin on ports
Richard A. O'Keefe
ok@REDACTED
Wed Jul 31 03:51:06 CEST 2013
I think we may be approaching clarity here.
Whether the pipes in your underlying UNIX are bidirectional
or not, whether your popen() supports a "r+" argument or not,
bidirectional pipe-based communication between a parent
process and a child process is safe *IF*
(1) the child process first reads all the data without writing
and some time after receiving EOF writes all its results
without reading, *OR*
(2) both programs have been specially written to communicate
in this way, possibly using asynchronous I/O, non-blocking
I/O, or multiple threads in some way, *AND*
they are aware of the value of PIPE_BUF that applies to
the system they are running on.
(3) pipes let you report end-of-file by closing them, but no
other signal. In order to signal a program at the other
end of a pipe, you need to know the process ID of the
process, which for the equivalent of popen("foobar",...)
is not trivially found.
(4) To send attention signals of some sort, you need to use
pty(4)s.
Per Hedeland wrote: "Erlang open_port/2 *by default* creates
a bi-directional, deadlock-free communication channel to the
external process." That's still not quite right. The thing
that governs whether a deadlock is possible or not is the
*protocol* the communicating processes use. And it is still
the case that an Erlang process may be deadlocked this way;
it's just that the whole Erlang system won't be tied up if it
happens.
More information about the erlang-questions
mailing list