popen, pclose - initiate pipe to/from a process
FILE *popen (const char *command, const char *type);
int pclose (FILE *stream);
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. Type is an I/O mode,
either r for reading or w for writing. The value returned is a stream
pointer such that one can write to the standard input of the command, if
the I/O mode is w, 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 stream opened by popen should be closed by pclose, which waits for the
associated process to terminate and returns the exit status of the
Because open files are shared, a type r command may be used as an input
filter and a type w as an output filter.
A typical call may be:
char *cmd = "/usr/bin/ls *.c";
if ((ptr = popen(cmd, "r")) != NULL)
while (fgets(buf, BUFSIZ, ptr) != NULL)
(void) printf("%s", buf);
This will print in stdout [see stdio (3S)] all the file names in the
current directory that have a ``.c'' suffix.
pipe(2), wait(2), fclose(3S), fopen(3S), stdio(3S), system(3S).
popen returns a NULL pointer if files or processes cannot be created.
Pclose returns -1 if stream is not associated with a ``popened'' command.
If the original and ``popened'' processes concurrently read or write a
common file, neither should use buffered I/O, because the buffering gets
all mixed up. Problems with an output filter may be forestalled by
careful buffer flushing, e.g. with fflush [see fclose(3S)].
Full pathnames should be used (or reset PATH variable) and the IFS
environment variable should be set to space and tab("\t") to avoid
possible security problems. It should be noted that these environment
variables are inherited from the parent process.
PPPPaaaaggggeeee 2222 [ Back ]