From 15740f8afdbcb5ff0489c3ef49c8cf176accf004 Mon Sep 17 00:00:00 2001 From: Michael Kerrisk Date: Fri, 9 Dec 2005 14:24:10 +0000 Subject: [PATCH] Added example program. --- man2/pipe.2 | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/man2/pipe.2 b/man2/pipe.2 index 8b0115537..23688bfe2 100644 --- a/man2/pipe.2 +++ b/man2/pipe.2 @@ -60,6 +60,62 @@ Too many file descriptors are in use by the process. The system limit on the total number of open files has been reached. .SH "CONFORMING TO" POSIX.1 +.SH EXAMPLE +The following program creates a pipe, and then +.BR fork (2)s +to create a child process. +After the +.BR fork (2), +each process closes the descriptors that it doesn't need for the pipe +(see +.BR pipe (7)). +The parent then writes the string contained in the program's +command-line argument to the pipe, +and the child reads this string a byte at a time from the pipe +and echoes it on standard output. +.nf + +#include +#include +#include +#include +#include +#include + +int +main(int argc, char *argv[]) +{ + int pfd[2]; + pid_t cpid; + char buf; + + assert(argc == 2); + + if (pipe(pfd) == -1) { perror("pipe"); exit(EXIT_FAILURE); } + + cpid = fork(); + if (cpid == -1) { perror("fork"); exit(EXIT_FAILURE); } + + if (cpid == 0) { /* Child reads from pipe */ + close(pfd[1]); /* Close unused write end */ + + while (read(pfd[0], &buf, 1) > 0) + write(STDOUT_FILENO, &buf, 1); + + write(STDOUT_FILENO, "\\n", 1); + close(pfd[0]); + _exit(EXIT_SUCCESS); + + } else { /* Parent writes argv[1] to pipe */ + close(pfd[0]); /* Close unused read end */ + write(pfd[1], argv[1], strlen(argv[1])); + close(pfd[1]); /* Reader will see EOF */ + wait(NULL); /* Wait for child */ + exit(EXIT_SUCCESS); + } +} + +.fi .SH "SEE ALSO" .BR fork (2), .BR read (2),