popen(3S) popen(3S)
NAME
popen, pclose - open/close a pipe to a command
SYNOPSIS
#include <stdio.h>
FILE *popen(const char *command, const char *mode);
int pclose(FILE *stream);
DESCRIPTION
popen() creates a pipe between the calling program and the command to
be executed. The arguments to popen() are pointers to null-terminated
strings. command consists of a shell command line. mode is an I/O
mode, either r for reading or w for writing. The value returned is a
stream pointer such that in the I/O mode w one can write to the stan-
dard input of the command, by writing to the file stream; and one can
read from the standard output of the command, if the I/O mode is r, by
reading from the file stream.
A pipe opened by popen() should be closed by pclose(), which waits for
the associated process to terminate and returns the exit status of the
command.
Because open files are shared, a type r command may be used as an
input filter and a type w as an output filter.
The behavior of popen() is specified only for values of mode of r and
w. Other values such as rb or wb might be supported by specific imple-
mentations, but these would not be portable features. Note that his-
torical 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 read mode r, and a mode of "anything else" as write mode w.
EXAMPLE
#include <stdio.h>
#include <stdlib.h>
main()
{
char *cmd = "/usr/bin/ls *.c";
char buf[BUFSIZ];
FILE *ptr;
if ((ptr = popen(cmd, "r")) != NULL)
while (fgets(buf, BUFSIZ, ptr) != NULL)
(void) printf("%s", buf);
return 0;
}
This program will print on the standard output [see stdio(3S)] all the
filenames in the current directory that have a .c suffix.
Page 1 Reliant UNIX 5.44 Printed 11/98
popen(3S) popen(3S)
RESULT
popen() returns a null pointer if files or processes cannot be
created.
pclose() returns -1 if stream is not associated with a popen() com-
mand.
NOTES
If the original and popen() processes concurrently read or write a
common file, neither should use buffered I/O. Problems with an output
filter may be forestalled by careful buffer flushing, e.g., with
fflush [see fclose(3S)].
A security hole exists through the IFS and PATH environment variables.
Full pathnames should be used, or PATH reset, and IFS should be set to
space and tab, "\t".
SEE ALSO
pipe(2), wait(2), fclose(3S), fopen(3S), stdio(3S), system(3S).
Page 2 Reliant UNIX 5.44 Printed 11/98