popen(3S)
popen, pclose --
initiate pipe to/from a process
Synopsis
#include <stdio.h>
FILE popen(const char command, const char type);
int pclose(FILE stream);
Description
popen
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
[see
intro(3)];
and one can read from the standard output of the command,
if the I/O mode is
r,
by reading from the file
stream.
popen forks to create a child process that runs the
command interpreter specified by the SHELL environment
variable in the caller's environment.
If SHELL is not set, then /bin/sh is used.
This shell executes command.
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.
Errors
popen
returns a
null pointer
if files or processes cannot be created.
pclose
returns -1 if
stream
is not associated with a
popened
command.
Usage
Here is an example of a typical call:
#include <stdio.h>
#include <stdlib.h>
main()
{
char *cmd = "/usr/bin/ls *.c";
char buf[BUFSIZ];
FILE *ptr;
if ((ptr = popen(cmd, "r")) != NULL)
while (fgets(buf, BUFSIZ, ptr) != NULL)
(void) printf("%s", buf);
return 0;
}
This program will print on the standard output
[see
Intro(3S)]
all the file names in the current directory that have a .c suffix.
References
fclose(3S),
fopen(3S),
Intro(3S),
pipe(2),
system(3S),
wait(2)
Notices
If the original and
popened
processes concurrently read or write a common file,
neither should use buffered I/O.
Problems with an output filter may be
forestalled by careful buffer flushing,
for example, with
fflush
[see
fclose(3S)].
A security hole exists through the IFS and PATH environment
variables.
Full pathnames should be used (or PATH reset)
and IFS should be set to space and tab
(``" \t"'').
Compatibility
Previous versions of UnixWare and SCO OpenServer always used /bin/sh as
the shell in which command is executed.
Applications built for previous system versions may require that
SHELL be set to /bin/sh in the caller's environment.
© 2004 The SCO Group, Inc. All rights reserved.
UnixWare 7 Release 7.1.4 - 25 April 2004