pipewrite.c (48 lines of code) (raw):
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define SECRET "MULUMULU"
#define IN 0
#define OUT 1
int
main(int argc, char *argv[])
{
int pipes[2];
pid_t pid;
char buf[16];
ssize_t n;
int i, quiet;
quiet = argc == 2 && !strcmp("-q", argv[1]);
if (pipe(pipes) == -1)
err(1, "pipe");
pid = fork();
switch (pid) {
case -1:
err(1, "fork");
break;
case 0: /* child */
n = read(pipes[IN], buf, sizeof(buf));
switch (n) {
case -1:
err(1, "read");
case 0:
errx(1, "read EOF");
default:
if (!quiet) {
printf("read %zd bytes: ", n);
for (i = 0; i < n; i++)
putchar(buf[i]);
putchar('\n');
}
printf("DONE\n"); /* this is how we report success */
exit(0);
}
break;
default: /* parent */
n = write(pipes[OUT], SECRET, strlen(SECRET));
errx(1, "parent not killed, written %zd bytes", n);
}
return (0);
}