### 14.1 `popen`, `pclose`—tie a stream to a command string ¶

Synopsis

    #include <stdio.h>
    FILE *popen(const char *s, const char *mode);

    int pclose(FILE *f);

Description
Use `popen` to create a stream to a child process executing a command string `*s` as processed by `/bin/sh` on your system. The argument mode must start with either ‘`r`’, where the stream reads from the child’s `stdout`, or ‘`w`’, where the stream writes to the child’s `stdin`. As an extension, mode may also contain ‘`e`’ to set the close-on-exec bit of the parent’s file descriptor. The stream created by `popen` must be closed by `pclose` to avoid resource leaks.

Streams created by prior calls to `popen` are not visible in subsequent `popen` children, regardless of the close-on-exec bit.

Use “`system(NULL)`” to test whether your system has `/bin/sh` available.

Returns
`popen` returns a file stream opened with the specified mode, or `NULL` if a child process could not be created. `pclose` returns -1 if the stream was not created by `popen` or if the application used `wait` or similar to steal the status; otherwise it returns the exit status of the child which can be interpreted in the same manner as a status obtained by `waitpid`.

Portability
POSIX.2 requires `popen` and `pclose`, but only specifies a mode of just `r` or `w`. Where `sh` is found is left unspecified.

Supporting OS subroutines required: `_exit`, `_execve`, `_fork_r`, `_wait_r`, `pipe`, `fcntl`, `sbrk`.