|
|
#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)) 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) to wait for the child process executing the command to terminate. On XENIX systems, pclose uses wait(S). 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 .