|
|
#include <stdio.h>FILE *popen (command, type) const char *command; char *type;
int pclose (stream) FILE *stream;
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.
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 pclose function returns -1 if stream is not associated with a command opened with the popen routine.
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.
X/Open Portability Guide, Issue 3, 1989 .