diff options
Diffstat (limited to 'dup.c')
-rw-r--r-- | dup.c | 61 |
1 files changed, 61 insertions, 0 deletions
@@ -0,0 +1,61 @@ +/* dup.c + * + * Child piping input to parent + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <wait.h> + +extern char **environ; + +int main(int argc, char **argv) +{ + pid_t pid; + int stat_loc; + + int pfds[2]; + int ret; + + if (pipe(pfds) == 0) + { + pid = fork(); + if (pid == -1) + { + perror("fork"); + exit(EXIT_FAILURE); + } + + if (!pid) + { + close(1); /* break the link to stdout */ + dup2(pfds[1], 1); /* redirect stdout to pfds[1] */ + close(pfds[0]); /* child will not be reading anything from out pipe */ + + execlp("ls", "ls", "-1", NULL); + } + else + { + close(0); /* break the link to stdin */ + dup2(pfds[0], 0); /* redirect stdout to pfds[0] */ + close(pfds[1]); /* parent will not be writing anything into our pipe */ + + ret = waitpid(pid, &stat_loc, WCONTINUED); + execlp("wc", "wc", "-l", NULL); + } + } + else + { + perror("pipe"); + exit(EXIT_FAILURE); + } + + close(pfds[0]); + close(pfds[1]); + + return 0; +} + |