summaryrefslogtreecommitdiffstats
path: root/dup.c
diff options
context:
space:
mode:
Diffstat (limited to 'dup.c')
-rw-r--r--dup.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/dup.c b/dup.c
new file mode 100644
index 0000000..e70b804
--- /dev/null
+++ b/dup.c
@@ -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;
+}
+