#include <unistd.h> int pipe(int fd[2]);
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.
pipe
returns 0 if it is successful, and
- 1 if it is not successful.
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 MVS 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. */ }
mkfifo
Copyright (c) 1998 SAS Institute Inc. Cary, NC, USA. All rights reserved.