| POPEN(3) | Library Functions Manual | POPEN(3) | 
popen, popenve,
  pclose —
#include <stdio.h>
FILE *
  
  popen(const
    char *command, const char
    *type);
FILE *
  
  popenve(const
    char *path, char * const
    *argv, char * const
    *envp, const char
    *type);
int
  
  pclose(FILE
    *stream);
popen() function “opens” a process by
  creating an IPC connection, forking, and invoking the shell. 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 sockets, the
  type 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. In
  addition if the character ‘e’ is present
  in the type string, the file descriptor used internally
  is set to be closed on exec(3).
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 popenve() function is similar to
    popen() but the first three arguments are passed to
    execve(2) and there is no
    shell involved in the command invocation.
The return value from popen() and
    popenve() 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 command's 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
    command's standard output, and the command's 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().
popen() function returns
  NULL if the
  vfork(2),
  pipe(2), or
  socketpair(2) calls fail, or
  if it cannot allocate memory, preserving the errno from those functions.
The pclose() function returns -1 if
    stream is not associated with a
    “popened” command, if stream has already
    been “pclosed”, setting errno to ESRCH
    or if wait4(2) returns an
    error, preserving the errno returned by
    wait4(2).
popen() and pclose()
  functions conform to IEEE Std 1003.2-1992
  (“POSIX.2”).
popen() and a pclose()
  function appeared in Version 7 AT&T UNIX.
popen(), if the original
  process has done a buffered read, the command's input position may not be as
  expected. Similarly, the output from a command opened for writing may become
  intermingled with that of the original process. The latter can be avoided by
  calling fflush(3) before
  popen().
Failure to execute the shell is indistinguishable from the shell's failure to execute command, or an immediate exit of the command. The only hint is an exit status of 127.
The popen() argument always calls
    sh(1), never calls
    csh(1).
The popenve() function first appeared in
    NetBSD 8.
| January 19, 2015 | NetBSD 9.4 |