popen, pclose -- initiate a pipe to or from a process


cc . . . -lc

#include <stdio.h>

FILE *popen (command, type) const char *command; char *type;

int pclose (stream) FILE *stream;


popen- creates pipe between calling program and command

pclose- returns exit status of command

The popen function 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.


A typical call may be:

   char *cmd = "ls *.c";

FILE *ptr;
if ((ptr = popen(cmd, "r")) != NULL)
while (fgets(buf, n, ptr) != NULL)
(void) printf("%s ",buf);

This prints in stdout (see stdio(S-osr5)) all the file names in the current directory that have a ``.c'' suffix.


The popen function returns a NULL pointer if files or processes cannot be created.

The pclose function returns -1 if stream is not associated with a command opened with the popen routine.


If the original and those processes opened with popen 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, for example, with fflush(S-osr5).

On UNIX systems, pclose uses waitpid(S-osr5) to wait for the child process executing the command to terminate. On XENIX systems, pclose uses wait(S-osr5). If the function evaluated on receipt of a SIGCLD signal is set to SIG_IGN, then the behavior of pclose depends on which type of system the process is running on. On UNIX systems, pclose will return a status of -1, and set errno to ECHILD. On XENIX systems, pclose will block the process until all child processed terminate, and then return a status of -1, and set errno to ECHILD. However, a deadlock occurs because the child process that executed the command will not terminate until its parent receives its SIGCLD signal.

See also

fclose(S-osr5), fflush(S-osr5), fopen(S-osr5), pipe(S-osr5), wait(S-osr5), stdio(S-osr5), system(S-osr5)

Standards conformance

pclose and popen are conformant with:

X/Open Portability Guide, Issue 3, 1989 .

© 2005 The SCO Group, Inc. All rights reserved.
SCO OpenServer Release 6.0.0 -- 02 June 2005