SHOW:
|
|
- or go back to the newest paste.
1 | #include <sys/types.h> | |
2 | #include <sys/wait.h> | |
3 | #include <unistd.h> | |
4 | #include <stdio.h> | |
5 | #include <stdlib.h> | |
6 | #include <string.h> | |
7 | ||
8 | #define READ_END 0 | |
9 | #define WRITE_END 1 | |
10 | ||
11 | ||
12 | int | |
13 | main() { | |
14 | ||
15 | pid_t c1_pid = fork(); | |
16 | int c1_status = 0; | |
17 | ||
18 | int pipefd[2]; | |
19 | ||
20 | if (pipe(pipefd) == -1) { | |
21 | perror("pipe"); | |
22 | exit(EXIT_FAILURE); | |
23 | } | |
24 | ||
25 | ||
26 | - | // child |
26 | + | |
27 | perror("fork"); | |
28 | exit(EXIT_FAILURE); | |
29 | } else if (c1_pid == 0) { | |
30 | - | dup2(pipefd[1], STDOUT_FILENO); |
30 | + | // child 1 |
31 | - | close(pipefd[1]); |
31 | + | |
32 | - | close(pipefd[0]); |
32 | + | |
33 | ||
34 | dup2(pipefd[WRITE_END], STDOUT_FILENO); | |
35 | close(pipefd[WRITE_END]); | |
36 | close(pipefd[READ_END]); | |
37 | ||
38 | printf("hello world\n"); | |
39 | ||
40 | } else { | |
41 | // parent | |
42 | ||
43 | pid_t c2_pid = fork(); | |
44 | int c2_status = 0; | |
45 | ||
46 | if (c2_pid < 0) { | |
47 | perror("fork"); | |
48 | exit(EXIT_FAILURE); | |
49 | - | dup2(pipefd[0], STDIN_FILENO); |
49 | + | |
50 | - | close(pipefd[1]); |
50 | + | // child 2 |
51 | - | close(pipefd[0]); |
51 | + | |
52 | printf("second child\n"); | |
53 | ||
54 | dup2(pipefd[READ_END], STDIN_FILENO); | |
55 | close(pipefd[WRITE_END]); | |
56 | close(pipefd[READ_END]); | |
57 | ||
58 | char* myargs[2]; | |
59 | myargs[0] = strdup("/bin/cat"); | |
60 | myargs[1] = NULL; | |
61 | ||
62 | execvp(myargs[0], myargs); | |
63 | ||
64 | } else { | |
65 | // parent | |
66 | ||
67 | pid_t finished_c2_pid = waitpid(c2_pid, &c2_status, WUNTRACED); | |
68 | printf("finished c2 process: %d\n", finished_c2_pid); | |
69 | } | |
70 | ||
71 | close(pipefd[WRITE_END]); | |
72 | close(pipefd[READ_END]); | |
73 | ||
74 | pid_t finished_c1_pid = waitpid(c1_pid, &c1_status, WUNTRACED); | |
75 | printf("finished c1 process: %d\n", finished_c1_pid); | |
76 | } | |
77 | ||
78 | return 0; | |
79 | } |