NAME
popen — initiate
pipe streams to or from a process
SYNOPSIS
FILE *popen(const char *command, const char *mode);
DESCRIPTION
The popen () function shall execute the
command specified by the string
command.
It shall create a pipe between the calling program and the executed command,
and shall return a pointer to a stream that can be used to either read from
or write to the pipe.
The environment of the executed command shall be as if a child
process were created within the popen () call using
the fork(3) function, and the child invoked the
sh(1) utility using the call:
execl(shell path, "sh", "-c", command, (char *)0);
where shell path is an unspecified pathname for the sh(1) utility.
The popen () function shall ensure that
any streams from previous popen () calls that remain
open in the parent process are closed in the new child process.
The mode argument to
popen () is a string that specifies I/O mode:
- If mode is r, when the child process
is started, its file descriptor STDOUT_FILENO shall be the writable end of
the pipe, and the file descriptor fileno (
stream) in the calling process, where
stream is the stream pointer returned by
popen(), shall be the readable end of the pipe. - If mode is w, when the child process
is started its file descriptor STDIN_FILENO shall be the readable end of
the pipe, and the file descriptor fileno (
stream) in the calling process, where
stream is the stream pointer returned by
popen(), shall be the writable end of the pipe. - If mode is any other value, the result is undefined.
After popen (), both the parent and the
child process shall be capable of executing independently before either
terminates.
Pipe streams are byte-oriented.
RETURN VALUE
Upon successful completion, popen () shall
return a pointer to an open stream that can be used to read or write to the
pipe. Otherwise, it shall return a null pointer and may set
errno to indicate the error.
ERRORS
The popen () function may fail if:
- [EMFILE]
- {FOPEN_MAX} or {STREAM_MAX} streams are currently open in the calling process.
- [EINVAL]
- The mode argument is invalid.
The popen () function may also set
errno values as described by fork(3) or
pipe(3) .
EXAMPLES
None.
APPLICATION USAGE
Since open files are shared, a mode r command can be used as an input filter and a mode w command as an output filter.
Buffered reading before opening an input filter may leave the standard input of that filter mispositioned. Similar problems with an output filter may be prevented by careful buffer flushing; for example, with fflush(3) .
A stream opened by popen () should be
closed by pclose(3).
The behavior of popen () is
specified for values of mode of r and
w. Other modes such as
rb and
wb might be
supported by specific implementations, but these would not be portable
features. Note that historical implementations of
popen () only check to see if the first character of
mode is r. Thus, a
mode of
robert the
robot would be treated as mode
r, and a mode of
anything
else would be treated as mode
w.
If the application calls waitpid(3) or
waitid(3) with a pid argument greater
than 0, and it still has a stream that was called with
popen () open, it must ensure that
pid does not refer to the process started by
popen ().
To determine whether or not the environment specified in the Shell and Utilities volume of IEEE Std 1003.1-2001 (“POSIX.1”) is present, use the function call:
sysconf(_SC_2_VERSION)
(See sysconf(3) ).
RATIONALE
The popen () function should not be used
by programs that have set user (or group) ID privileges. The
fork(3) and
exec
family of functions (except execlp(3) and
execvp(3)), should be used instead. This prevents any
unforeseen manipulation of the environment of the user that could cause
execution of commands not anticipated by the calling program.
If the original and popen ()ed processes
both intend to read or write or read and write a common file, and either
will be using FILE-type C functions ( fread(3),
fwrite(3), and so on), the rules for sharing file handles
must be observed (see xsh_chap02_05(3) ).
FUTURE DIRECTIONS
None.
SEE ALSO
pclose(3) , pipe(3) , sysconf(3) , system(3) , the Base Definitions volume of IEEE Std 1003.1-2001 (“POSIX.1”), <stdio.h>, the Shell and Utilities volume of IEEE Std 1003.1-2001 (“POSIX.1”), sh(1)
CHANGE HISTORY
First released in Issue 1. Derived from Issue 1 of the SVID.
Issue 5
A statement is added to the DESCRIPTION indicating that pipe streams are byte-oriented.
Issue 6
The following new requirements on POSIX implementations derive from alignment with the Single UNIX Specification:
- The optional [EMFILE] error condition is added.
End of informative text. footer end