DESCRIPTION
 The  popen function "opens" a process by creating a bidirectional pipe forking, and invoking the shell. Any streams opened by previous  popen calls in the parent process are closed in the new child process. Historically,  popen was implemented with a unidirectional pipe; hence many implementations of  popen only allow the  type argument to specify reading or writing, not both. Since  popen is now implemented using a bidirectional pipe, the  type argument may request a bidirectional data flow. The  type argument is a pointer to a null-terminated string which must be r for reading, w for writing, or r+ for reading and writing.  The  command argument is a pointer to a null-terminated string containing a shell command line. This command is passed to  /bin/sh using the -c  flag; interpretation, if any, is performed by the shell. 
 The return value from  popen is a normal standard  I/O stream in all respects save that it must be closed with  pclose rather than  fclose. Writing to such a stream writes to the standard input of the command; the commands standard output is the same as that of the process that called  popen, unless this is altered by the command itself. Conversely, reading from a "popened" stream reads the commands standard output, and the commands standard input is the same as that of the process that called  popen. 
 Note that output  popen streams are fully buffered by default. 
 The  pclose function waits for the associated process to terminate and returns the exit status of the command as returned by wait4(2).  
RETURN VALUES
 The  popen function returns  NULL if the fork(2) or pipe(2) calls fail, or if it cannot allocate memory.  The  pclose function returns -1 if  stream is not associated with a "popened" command, if  stream already "pclosed", or if wait4(2) returns an error.  
ERRORS
 The  popen function does not reliably set  errno.   
SEE ALSO
 sh(1), fork(2), pipe(2), wait4(2), fclose(3), fflush(3), fopen(3), stdio(3), system(3)  
HISTORY
  
BUGS
 fflush(3) sh(1), csh(1).