[mercury-users] Read term from a pipe?
Richard A. O'Keefe
ok at atlas.otago.ac.nz
Tue Jun 9 07:11:27 AEST 1998
The Mercury standard library does not support this,
mainly because implementing it in a portable fashion is
a non-trivial exercise. The obvious way of implementing it
would be to use the popen() function which is available on
many Unix systems, but this function is not included
in the ANSI C standard or even in the POSIX standard.
This is somewhat misleading. popen() is not in the POSIX.1 standard.
I believe there were two reasons for this.
(1) As the rationale section of the standard points out, in "historical"
(i.e. then existing) implementations, the sequence
stream = popen("/bin/true");
(void) system("sleep 100");
(void) pclose(stream);
didn't work. Much to my surprise: back in 1981 I wondered how
popen()/pclose() could possibly work given the wait() interface,
and did figure out a way. It _could_ have been done right but
it wasn't.
(2) popen() is defined in terms of the shell. That's why popen() was
supposed to be in the POSIX.2 (shell and utilities) standard. I
haven't a copy of POSIX.2; I know it extended the C library quite
a bit with things like glob(), so it would be rather startling if
popen() was not in fact part of POSIX.2 (which is part of "the"
POSIX standard).
I would note that there is code out there that could be stolen to make
popen()-like functionality more generally available. In Tcl, you use
the normal 'open' command, but make the first character of the file
name a vertical bar (a long-standard UNIX convention). Tcl comes with
_free_ code that could easily and legitimately be swiped by Mercury
that supports 'open {| foo bar} ...' on Unix and all flavours of Windows,
but not MacOS. I strongly recommend that the Mercury team take a look
at Tcl for multiplatform support. You don't have to like the language,
just the price ($0.00) for re-using the multiplatform support code.
More information about the users
mailing list