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


   #include <stdio.h>

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 [see intro(3)]; and one can read from the standard output of the command, if the I/O mode is r, by reading from the file stream.

popen forks to create a child process that runs the command interpreter specified by the SHELL environment variable in the caller's environment. If SHELL is not set, then /bin/sh is used. This shell executes command.

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.


popen returns a null pointer if files or processes cannot be created.

pclose returns -1 if stream is not associated with a popened command.


Here is an example of a typical call:
   #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 Intro(3S)] all the file names in the current directory that have a .c suffix.


fclose(3S), fopen(3S), Intro(3S), pipe(2), system(3S), wait(2)


If the original and popened 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, for example, 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"'').


Previous versions of UnixWare and SCO OpenServer always used /bin/sh as the shell in which command is executed. Applications built for previous system versions may require that SHELL be set to /bin/sh in the caller's environment.
© 2004 The SCO Group, Inc. All rights reserved.
UnixWare 7 Release 7.1.4 - 25 April 2004