P2OPEN(3GEN) String Pattern-Matching Library Functions P2OPEN(3GEN)
NAME
p2open, p2close - open, close pipes to and from a command
SYNOPSIS
cc [
flag ... ]
file ...
-lgen [
library ... ]
#include <libgen.h>
int p2open(
const char *cmd,
FILE *fp[2]);
int p2close(
FILE *fp[2]);
DESCRIPTION
The
p2open()gfunction forks and execs a shell running the command
line pointed to by
cmd. On return,
fp[0] points to a
FILE pointer to
write the command's standard input and
fp[1] points to a
FILE pointer
to read from the command's standard output. In this way the program
has control over the input and output of the command.
The function returns
0 if successful; otherwise, it returns
-1.
The
p2close() function is used to close the file pointers that
p2open() opened. It waits for the process to terminate and returns
the process status. It returns
0 if successful; otherwise, it returns
-1.
RETURN VALUES
A common problem is having too few file descriptors. The
p2close() function returns
-1 if the two file pointers are not from the same
p2open().
EXAMPLES
Example 1: Example of file descriptors.
#include <stdio.h>
#include <libgen.h>
main(argc,argv)
int argc;
char **argv;
{
FILE *fp[2];
pid_t pid;
char buf[16];
pid=p2open("/usr/bin/cat", fp);
if ( pid == -1 ) {
fprintf(stderr, "p2open failed\n");
exit(1);
}
write(fileno(fp[0]),"This is a test\n", 16);
if(read(fileno(fp[1]), buf, 16) <=0)
fprintf(stderr, "p2open failed\n");
else
write(1, buf, 16);
(void)p2close(fp);
}
ATTRIBUTES
See
attributes(7) for descriptions of the following attributes:
+---------------+-----------------+
|ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+---------------+-----------------+
|MT-Level | Unsafe |
+---------------+-----------------+
SEE ALSO
fclose(3C),
popen(3C),
setbuf(3C),
attributes(7)NOTES
Buffered writes on
fp[0] can make it appear that the command is not
listening. Judiciously placed
fflush() calls or unbuffering
fp[0] can
be a big help; see
fclose(3C).
Many commands use buffered output when connected to a pipe. That,
too, can make it appear as if things are not working.
Usage is not the same as for
popen(), although it is closely related.
December 29, 1996 P2OPEN(3GEN)