1997-02-27 07:32:31 +00:00
|
|
|
.\" Copyright (c) 1991, 1993
|
|
|
|
.\" The Regents of the University of California. All rights reserved.
|
|
|
|
.\"
|
|
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
|
|
.\" modification, are permitted provided that the following conditions
|
|
|
|
.\" are met:
|
|
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
|
|
.\" 3. All advertising materials mentioning features or use of this software
|
|
|
|
.\" must display the following acknowledgement:
|
|
|
|
.\" This product includes software developed by the University of
|
|
|
|
.\" California, Berkeley and its contributors.
|
|
|
|
.\" 4. Neither the name of the University nor the names of its contributors
|
|
|
|
.\" may be used to endorse or promote products derived from this software
|
|
|
|
.\" without specific prior written permission.
|
|
|
|
.\"
|
|
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
|
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
.\" SUCH DAMAGE.
|
|
|
|
.\"
|
|
|
|
.\" @(#)popen.3 8.1 (Berkeley) 6/4/93
|
|
|
|
.\"
|
|
|
|
.TH POPEN 3 "23 February 1997" GNO "Library Routines"
|
|
|
|
.SH NAME
|
|
|
|
.BR popen ,
|
|
|
|
.BR pclose
|
|
|
|
\- process I/O
|
|
|
|
.SH SYNOPSIS
|
|
|
|
#include <stdio.h>
|
|
|
|
.sp 1
|
|
|
|
FILE *\fBpopen\fR (const char *\fIcommand\fR, const char *\fItype\fR);
|
|
|
|
.br
|
|
|
|
int \fBpclose\fR (FILE *\fIstream\fR);
|
|
|
|
.SH DESCRIPTION
|
|
|
|
The
|
|
|
|
.BR popen
|
|
|
|
function
|
|
|
|
.IR opens
|
|
|
|
a process by creating a pipe,
|
|
|
|
forking,
|
|
|
|
and invoking the shell.
|
|
|
|
Since a pipe is by definition unidirectional, the
|
|
|
|
.I type
|
|
|
|
argument may specify only reading or writing, not both;
|
|
|
|
the resulting stream is correspondingly read-only or write-only.
|
|
|
|
.LP
|
|
|
|
The
|
|
|
|
.I command
|
|
|
|
argument is a pointer to a null-terminated string
|
|
|
|
containing a shell command line.
|
|
|
|
This command is passed to
|
|
|
|
.BR /bin/sh
|
|
|
|
using the
|
|
|
|
.BR \-c
|
|
|
|
flag; interpretation, if any, is performed by the shell.
|
|
|
|
The
|
|
|
|
.I mode
|
|
|
|
argument is a pointer to a null-terminated string
|
|
|
|
which must be either
|
|
|
|
.BR r
|
|
|
|
for reading
|
|
|
|
or
|
|
|
|
.BR w
|
|
|
|
for writing.
|
|
|
|
.LP
|
|
|
|
The return value from
|
|
|
|
.BR popen
|
|
|
|
is a normal standard I/O stream in all respects
|
|
|
|
save that it must be closed with
|
|
|
|
.BR pclose
|
|
|
|
rather than
|
|
|
|
.BR fclose .
|
|
|
|
Writing to such a stream
|
|
|
|
writes to the standard input of the command;
|
|
|
|
the command's standard output is the same as that of the process that called
|
|
|
|
.BR popen ,
|
|
|
|
unless this is altered by the command itself.
|
|
|
|
Conversely, reading from a
|
|
|
|
.IR popened
|
|
|
|
stream reads the command's standard output, and
|
|
|
|
the command's standard input is the same as that of the process that called
|
|
|
|
.BR popen .
|
|
|
|
.LP
|
|
|
|
Note that output
|
|
|
|
.BR popen
|
|
|
|
streams are fully buffered by default.
|
|
|
|
.LP
|
|
|
|
The
|
|
|
|
.BR pclose
|
|
|
|
function waits for the associated process to terminate
|
|
|
|
and returns the exit status of the command
|
|
|
|
as returned by
|
|
|
|
.BR waitpid .
|
|
|
|
.SH RETURN VALUE
|
|
|
|
The
|
|
|
|
.BR popen
|
|
|
|
function returns
|
|
|
|
.BR NULL
|
|
|
|
if the
|
|
|
|
.BR fork (2)
|
|
|
|
or
|
|
|
|
.BR pipe (2)
|
|
|
|
calls fail,
|
|
|
|
or if it cannot allocate memory.
|
|
|
|
.LP
|
|
|
|
The
|
|
|
|
.BR pclose
|
|
|
|
function
|
|
|
|
returns \-1 if
|
|
|
|
.I stream
|
|
|
|
is not associated with a
|
|
|
|
.IR popened
|
|
|
|
command, if
|
|
|
|
.I stream
|
|
|
|
already
|
|
|
|
.IR pclosed ,
|
|
|
|
or if
|
|
|
|
.BR waitpid
|
|
|
|
returns an error.
|
|
|
|
.SH ERRORS
|
|
|
|
The
|
|
|
|
.BR popen
|
|
|
|
function does not reliably set
|
|
|
|
.IR errno .
|
|
|
|
.SH BUGS
|
|
|
|
Since the standard input of a command opened for reading
|
|
|
|
shares its seek offset with the process that called
|
|
|
|
.BR popen ,
|
|
|
|
if the original process has done a buffered read,
|
|
|
|
the command's input position may not be as expected.
|
|
|
|
Similarly, the output from a command opened for writing
|
|
|
|
may become intermingled with that of the original process.
|
|
|
|
The latter can be avoided by calling
|
|
|
|
.BR fflush (3)
|
|
|
|
before
|
|
|
|
.BR popen .
|
|
|
|
.LP
|
|
|
|
Failure to execute the shell
|
|
|
|
is indistinguishable from the shell's failure to execute
|
|
|
|
.IR command ,
|
|
|
|
or an immediate exit of the command.
|
|
|
|
The only hint is an exit status of 127.
|
|
|
|
.LP
|
|
|
|
The
|
|
|
|
.BR popen
|
|
|
|
argument
|
|
|
|
always calls
|
|
|
|
.BR sh (1),
|
|
|
|
never calls
|
|
|
|
.BR csh (1).
|
|
|
|
(Because of a lack of available
|
|
|
|
.BR sh (1),
|
|
|
|
the current GNO implementation always calls
|
|
|
|
.BR gsh (1).)
|
|
|
|
.LP
|
|
|
|
This implementation makes use of
|
|
|
|
.BR waitpid (2).
|
|
|
|
Because
|
|
|
|
.BR waitpid
|
|
|
|
is not currently provided by the GNO kernel,
|
|
|
|
.BR pclose
|
|
|
|
is affected by the same bug as is
|
|
|
|
.BR waitpid ;
|
|
|
|
other child processes' exit status may be caught (and discarded)
|
|
|
|
while waiting for the process created by
|
|
|
|
.BR popen .
|
|
|
|
Consequently, if the parent processes is doing any other
|
|
|
|
.BR waitpid
|
|
|
|
calls (either directly or indirectly),
|
|
|
|
.BR pclose
|
|
|
|
may never return.
|
|
|
|
.LP
|
|
|
|
Under GNO, the memory region pointed to by
|
|
|
|
.IR command
|
|
|
|
must be able to be referenced up to the point that the child process
|
|
|
|
does its
|
|
|
|
.BR execl (2).
|
|
|
|
This implies that if
|
|
|
|
.IR command
|
|
|
|
is allocated on the stack and the function which allocated it returns
|
|
|
|
before the program calls
|
|
|
|
.BR pclose
|
|
|
|
(or if the parent exits and makes its child into a zombie), there is a
|
|
|
|
chance that the forked child of
|
|
|
|
.BR popen
|
|
|
|
may try to
|
|
|
|
.BR execl
|
|
|
|
an arbitrary command, the results of which are undefined.
|
1997-09-19 15:47:03 +00:00
|
|
|
.LP
|
|
|
|
.BR gsh (1)
|
|
|
|
appears to hang on occasion when executing
|
|
|
|
.BR popen 's
|
|
|
|
arguments. The symptom is that the pclose never returns, and the process
|
|
|
|
table (see
|
|
|
|
.BR ps (1))
|
|
|
|
shows that the forked
|
|
|
|
.BR gsh 's
|
|
|
|
user time is forever increasing.
|
1997-02-27 07:32:31 +00:00
|
|
|
.SH SEE ALSO
|
|
|
|
.BR gsh (1),
|
|
|
|
.BR sh (1),
|
|
|
|
.BR fork (2),
|
|
|
|
.BR pipe (2),
|
|
|
|
.BR waitpid (2),
|
|
|
|
.BR fclose (3),
|
|
|
|
.BR fflush (3),
|
|
|
|
.BR fopen (3),
|
|
|
|
.BR stdio (3),
|
|
|
|
.BR system (3)
|
|
|
|
.SH HISTORY
|
|
|
|
A
|
|
|
|
.BR popen
|
|
|
|
and a
|
|
|
|
.BR pclose
|
|
|
|
function appeared in v7.
|