POPEN(3S) POPEN(3S) NAME popen, pclose - initiate pipe to/from a process SYNOPSIS #include <stdio.h> FILE *popen (const char *command, const char *type); 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. 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 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. EXAMPLE A typical call may be: #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 will print in stdout [see stdio (3S)] all the file names in the current directory that have a ``.c'' suffix. SEE ALSO pipe(2), wait(2), fclose(3S), fopen(3S), stdio(3S), system(3S). DIAGNOSTICS popen returns a NULL pointer if files or processes cannot be created. Pclose returns -1 if stream is not associated with a ``popened'' command. WARNING 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. Page 2