#include #include #include #include #include #include #include int main () { int fd; ssize_t nbytes; char buf[5]; if (mkfifo ("/tmp/myfifo", S_IRUSR | S_IWUSR | S_IWGRP) < 0 && errno != EEXIST) { perror ("mkfifo"); exit (-1); } if ((fd = open ("/tmp/myfifo", O_RDWR)) < 0) { perror ("open"); exit (-1); } switch (fork ()) { case -1: perror ("fork"); exit (-1); case 0: /* Child. */ nbytes = read (fd, buf, 4); if (nbytes != 4) { perror ("read"); exit (-1); } buf[4] = '\0'; printf ("child read %d bytes: %s\n", nbytes, buf); if (close (fd) < 0) { perror ("child close"); exit (-1); } exit (0); default: /* Parent. */ if (close (fd) < 0) { perror ("parent close"); exit (-1); } printf ("parent waiting for child to read\n"); wait (NULL); break; } }