[m-users.] Pass stream or string to standard input of shell command
Volker Wysk
post at volker-wysk.de
Tue Mar 17 02:27:48 AEDT 2020
Am Montag, den 16.03.2020, 14:50 +0100 schrieb Volker Wysk:
> Am Montag, den 16.03.2020, 13:56 +0100 schrieb Dirk Ziegemeyer:
> > Hello,
> >
> > is it possible to pass an io.text_output_stream or string to the
> > standard input of an operating system shell command called from
> > within Mercury?
> >
> > Instead of first writing output to a large text file on disk and
> > then
> > compressing it by calling gzip with
> >
> > io.call_system("gzip FILE", Result, !IO)
> >
> > I would rather pass the uncompressed stream or string directly to
> > the
> > standard input of gzip.
>
> I don't know if this is already supported in the standard library.
> But
> you could do it with posix calls. You'd have to create a pipe, using
> pipe(), then do fork(). Then you'd close the read end in the parent
> process and the write end in the child process. You'd do dup() to
> copy
> the read end to the standard input of the child process. Then you'd
> do
> exec() in order to start the gzip program in the child process.
>
> Then you have a pipe to the gzip program in the parent process (your
> mercury program). In order to use it, you would have to attach a
> stream
> to that pipe (to its file descriptor). I don't know if that's
> possible.
>
> I've checked: The "posix" extra library provides predicates for the
> mentioned posix library calls. It's odd, however, that the close()
> predicate is in the posix.open module.
I've forgotten: You also need to set the pipe to close-on-exec.
Bye
Volker
More information about the users
mailing list