|  | /* Creating a Pipe | 
|  | Copyright (C) 1991-2016 Free Software Foundation, Inc. | 
|  |  | 
|  | This program is free software; you can redistribute it and/or | 
|  | modify it under the terms of the GNU General Public License | 
|  | as published by the Free Software Foundation; either version 2 | 
|  | of the License, or (at your option) any later version. | 
|  |  | 
|  | This program is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | GNU General Public License for more details. | 
|  |  | 
|  | You should have received a copy of the GNU General Public License | 
|  | along with this program; if not, if not, see <http://www.gnu.org/licenses/>. | 
|  | */ | 
|  |  | 
|  | #include <sys/types.h> | 
|  | #include <unistd.h> | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  |  | 
|  | /* Read characters from the pipe and echo them to @code{stdout}.  */ | 
|  |  | 
|  | void | 
|  | read_from_pipe (int file) | 
|  | { | 
|  | FILE *stream; | 
|  | int c; | 
|  | stream = fdopen (file, "r"); | 
|  | while ((c = fgetc (stream)) != EOF) | 
|  | putchar (c); | 
|  | fclose (stream); | 
|  | } | 
|  |  | 
|  | /* Write some random text to the pipe. */ | 
|  |  | 
|  | void | 
|  | write_to_pipe (int file) | 
|  | { | 
|  | FILE *stream; | 
|  | stream = fdopen (file, "w"); | 
|  | fprintf (stream, "hello, world!\n"); | 
|  | fprintf (stream, "goodbye, world!\n"); | 
|  | fclose (stream); | 
|  | } | 
|  |  | 
|  | int | 
|  | main (void) | 
|  | { | 
|  | pid_t pid; | 
|  | int mypipe[2]; | 
|  |  | 
|  | /*@group*/ | 
|  | /* Create the pipe.  */ | 
|  | if (pipe (mypipe)) | 
|  | { | 
|  | fprintf (stderr, "Pipe failed.\n"); | 
|  | return EXIT_FAILURE; | 
|  | } | 
|  | /*@end group*/ | 
|  |  | 
|  | /* Create the child process.  */ | 
|  | pid = fork (); | 
|  | if (pid == (pid_t) 0) | 
|  | { | 
|  | /* This is the child process. | 
|  | Close other end first.  */ | 
|  | close (mypipe[1]); | 
|  | read_from_pipe (mypipe[0]); | 
|  | return EXIT_SUCCESS; | 
|  | } | 
|  | else if (pid < (pid_t) 0) | 
|  | { | 
|  | /* The fork failed.  */ | 
|  | fprintf (stderr, "Fork failed.\n"); | 
|  | return EXIT_FAILURE; | 
|  | } | 
|  | else | 
|  | { | 
|  | /* This is the parent process. | 
|  | Close other end first.  */ | 
|  | close (mypipe[0]); | 
|  | write_to_pipe (mypipe[1]); | 
|  | return EXIT_SUCCESS; | 
|  | } | 
|  | } |