Chapter Contents |
Previous |
Next |
pipe |
Portability: | POSIX.1 conforming, UNIX compatible |
SYNOPSIS | |
DESCRIPTION | |
RETURN VALUE | |
EXAMPLE | |
RELATED FUNCTIONS | |
SEE ALSO |
SYNOPSIS |
#include <unistd.h> int pipe(int fd[2]);
DESCRIPTION |
pipe
creates an I/O channel through which a process communicates with another process
or with itself.
fd
points to a memory
area where two file descriptors are stored.
pipe
stores the file descriptor for the output end of the pipe in
fd[0]
, and it stores the file descriptor for
the input end of the pipe in
fd[2]
. The
first data written to the pipe are the first to be read.
O_NONBLOCK
and
FD_CLOEXEC
are turned
off at both ends of the pipe.
RETURN VALUE |
pipe
returns 0 if it is successful, and -1 if it is not successful.
EXAMPLE |
This example invokes the
ls
shell command using
fork
and
exec
, and uses a pipe allocated to file descriptor
1 to obtain the output of
ls
and write
it to
stderr
(which may be a non-HFS terminal
or disk file if the example is run under OS/390 batch or TSO):
#include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> #include <signal.h> #include <lclib.h> static void do_ls(char * const []); main() { int pipefds[2]; pid_t pid; char *const parmList[] = {"/bin/ls", "-l", "/u/userid/dirname", NULL }; char lsout[200]; /* buffer for out ls output */ int amt; int status; /* status code from ls */ fclose(stdout); /* Avoid stdio interfering with fd 1. */ pipe(pipefds); /* Create both ends of a pipe. */ /* Make write end of pipe fd 1. */ dup2(pipefds[1],STDOUT_FILENO); /* Close write end. */ if (pipefds[1] != 1) close(pipefds[1]); /* In child process, invoke ls. */ if ((pid = fork()) == 0) do_ls(parmList); close(1); /* Close write end of pipe in parent. */ for(;;) { /* Read from the pipe. */ amt = read(pipefds[0], lsout, sizeof(lsout)); if (amt <= 0) break; fwrite(lsout, 1, amt, stderr); /*Write ls output to stderr.*/ } wait(&status); /* Wait for ls to complete. */ close(pipefds[0]); /* Close pipe input end. */ if (WIFEXITED(status)) exit(WEXITSTATUS(status)); else /* If ls failed, use kill to fail the same way. */ kill(0, WTERMSIG(status)); } static void do_ls(char *const parmList[]) { int rc; rc = execvp("ls", parmList); /* Pass control to ls. */ /* execvp must have failed! */ perror("execvp failure"); abort(); /* Terminate process the hard way. */ }
RELATED FUNCTIONS |
SEE ALSO |
Chapter Contents |
Previous |
Next |
Top of Page |
Copyright © 2001 by SAS Institute Inc., Cary, NC, USA. All rights reserved.