ΠΠΎΠ³Π΄Π° Π»Π΅Π²ΡΠΉ ΠΏΠΎΡΠΎΠΌΠΎΠΊ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ°Π±ΠΎΡΡ, ΠΎΠ½ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΡΡΡ. Π‘ΠΈΡΡΠ΅ΠΌΠ° ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π·Π°ΠΊΡΡΠ²Π°Π΅Ρ Π²ΡΠ΅ Π΅Π³ΠΎ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΡΠ°ΠΉΠ»ΠΎΠ². ΠΠΎΠ³Π΄Π° ΡΡΠΎ ΡΠ»ΡΡΠ°Π΅ΡΡΡ, ΠΏΡΠ°Π²ΡΠΉ ΠΏΠΎΡΠΎΠΌΠΎΠΊ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π² ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΡΡΠ΅ΡΠ΅ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ° ΡΠ°ΠΉΠ»Π° ΠΈ ΡΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ ΠΈ Π²ΡΠΉΡΠΈ.
Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ch09-pipeline.c, ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ:
$ echo hi there | sed s/hi/hello/g
hello there
ΠΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°:
1 /* ch09-pipeline.c --- ΠΎΡΠ²Π΅ΡΠ²Π»ΡΠ΅Ρ Π΄Π²Π° ΠΏΡΠΎΡΠ΅ΡΡΠ° Π² ΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅Ρ.
2 ΠΠ»Ρ ΠΊΡΠ°ΡΠΊΠΎΡΡΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΎΡΠΈΠ±ΠΎΠΊ ΡΠ²Π΅Π΄Π΅Π½Π° ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌΡ. */
3
4 #include <stdio.h>
5 #include <errno.h>
6 #include <sys/types.h>
7 #include <sys/wait.h>
8 #include <unistd.h>
9
10 int pipefd[2];
11
12 extern void left_child(void), right_child(void);
13
14 /* main --- ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΠΈ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ ΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ */
15
16 int main(int argc, char **argv)
17 {
18 pid_t left_pid, right_pid;
19 pid_t ret;
20 int status;
21
22 if (pipe(pipefd) < 0) { /* ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠ°Π½Π°Π» Π² ΡΠ°ΠΌΠΎΠΌ Π½Π°ΡΠ°Π»Π΅ */
23 perror("pipe");
24 exit(1);
25 }
26
27 if ((left_pid = fork()) < 0) { /* ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ° */
28 perror("fork");
29 exit(1);
30 } else if (left_pid == 0)
31 left_child();
32
33 if ((right_pid = fork()) < 0) { /* ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ° */
34 perror("fork");
35 exit(1);
36 } else if (right_pid == 0)
37 right_child();
38
39 close(pipefd[0])); /* Π·Π°ΠΊΡΡΡΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΊΠΎΠΏΠΈΠΈ ΠΊΠ°Π½Π°Π»Π° */
40 close(pipefd[1]);
41
42 while ((ret = wait(&status)) > 0) { /* wait for children */
43 if (ret == left_pid)
44 printf("left child terminated, status: %x\n", status);
45 else if (ret == right_pid)
46 printf("right child terminated, status: %x\n", status);
47 else
48 printf("yow! unknown child %d terminated, status %x\n",
49 ret, status);
50 }
51
52 return 0;
53 }
Π‘ΡΡΠΎΠΊΠΈ 22β25 ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠ°Π½Π°Π». ΠΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π² ΡΠ°ΠΌΠΎΠΌ Π½Π°ΡΠ°Π»Π΅.
Π‘ΡΡΠΎΠΊΠΈ 27β31 ΡΠΎΠ·Π΄Π°ΡΡ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ°, Π° ΡΡΡΠΎΠΊΠΈ 33β37 ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ°. Π ΠΎΠ±ΠΎΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ΅ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π²Π΅ΡΠ²ΠΈ main() Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π΅ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°ΠΌΠΈ ΡΠ°ΠΉΠ»Π° ΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»Π΅Π½ΠΈΡ exec.
Π‘ΡΡΠΎΠΊΠΈ 39β40 Π·Π°ΠΊΡΡΠ²Π°ΡΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΡΡ ΠΊΠΎΠΏΠΈΡ ΠΊΠ°Π½Π°Π»Π°.
Π‘ΡΡΠΎΠΊΠΈ 42β50 Π² ΡΠΈΠΊΠ»Π΅ ΠΎΠΆΠΈΠ΄Π°ΡΡ ΠΏΠΎΡΠΎΠΌΠΊΠΎΠ², ΠΏΠΎΠΊΠ° wait() Π½Π΅ Π²Π΅ΡΠ½Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ.
55 /* left_child --- ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΡ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ° */
56
57 void left_child(void)
58 {
59 static char *left_argv[] = { "echo", "hi", "there", NULL };
60
61 close(pipefd[0]);
62 close(1);
63 dup(pipefd[1]);
64 close(pipefd[1]);
65
66 execvp("echo", left_argv);
67 _exit(errno == ENOENT ? 127 : 126);
68 }
69
70 /* right_child --- ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΡ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ° */
71
72 void right_child(void)
73 {
74 static char *right_argv[] = { "sed", "s/hi/hello/g", NULL };
75
76 close(pipefd[1]);
77 close(0);
78 dup(pipefd[0]);
79 close(pipefd[0]));
80
81 execvp("sed", right_argv);
82 _exit(errno == ENOENT ? 127 : 126);
83 }
Π‘ΡΡΠΎΠΊΠΈ 57β68 ΡΠ²Π»ΡΡΡΡΡ ΠΊΠΎΠ΄ΠΎΠΌ Π΄Π»Ρ Π»Π΅Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ°. ΠΡΠΎΡΠ΅Π΄ΡΡΠ° ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠΌ Π²ΡΡΠ΅ ΡΠ°Π³Π°ΠΌ, Π·Π°ΠΊΡΡΠ²Π°Ρ Π½Π΅Π½ΡΠΆΠ½ΡΠΉ ΠΊΠΎΠ½Π΅Ρ ΠΊΠ°Π½Π°Π»Π°, Π·Π°ΠΊΡΡΠ²Π°Ρ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΡΠΉ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ Π²ΡΠ²ΠΎΠ΄, ΠΏΠΎΠΌΠ΅ΡΠ°Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ dup() Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΠΉ ΠΊΠΎΠ½Π΅Ρ ΠΊΠ°Π½Π°Π»Π° Π½Π° Π½ΠΎΠΌΠ΅Ρ 1 ΠΈ Π·Π°ΠΊΡΡΠ²Π°Ρ Π·Π°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΡΠΉ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΠΉ ΠΊΠΎΠ½Π΅Ρ. Π ΡΡΠΎΡ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΡΠΎΠΊΠ° 66 Π²ΡΠ·ΡΠ²Π°Π΅Ρ execvp(), ΠΈ Π΅ΡΠ»ΠΈ ΠΎΠ½Π° Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ΅ΠΉ, ΡΡΡΠΎΠΊΠ° 67 Π²ΡΠ·ΡΠ²Π°Π΅Ρ _exit(). (ΠΠΎΠΌΠ½ΠΈΡΠ΅, ΡΡΠΎ ΡΡΡΠΎΠΊΠ° 67 Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ, Π΅ΡΠ»ΠΈ execvp() Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ ΡΠ΄Π°ΡΠ½ΠΎ.)
Π‘ΡΡΠΎΠΊΠΈ 72β83 Π΄Π΅Π»Π°ΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ ΠΆΠ΅ ΡΠ°Π³ΠΈ Π΄Π»Ρ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ°. ΠΠΎΡ ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅:
$ ch09-pipeline /* ΠΠ°ΠΏΡΡΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ */
left child terminated, status: 0 /* ΠΠ΅Π²ΡΠΉ ΠΏΠΎΡΠΎΠΌΠΎΠΊ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π΄ΠΎ Π²ΡΠ²ΠΎΠ΄Π° (!) */
hello there /* ΠΡΠ²ΠΎΠ΄ ΠΎΡ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ° */
right child terminated, status: 0
$ ch09-pipeline /* ΠΠΎΠ²ΡΠΎΡΠ½ΡΠΉ Π·Π°ΠΏΡΡΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ */
hello there /* ΠΡΠ²ΠΎΠ΄ ΠΎΡ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΌΠΊΠ° ΠΈ ... */
right child terminated, status: 0 /* ΠΡΠ°Π²ΡΠΉ ΠΏΠΎΡΠΎΠΌΠΎΠΊ Π·Π°Π²Π΅ΡΡΠ°Π΅ΡΡΡ Π΄ΠΎ Π»Π΅Π²ΠΎΠ³ΠΎ */
left child terminated, status: 0
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΏΠΎΡΡΠ΄ΠΎΠΊ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π·Π°Π²Π΅ΡΡΠ°ΡΡΡΡ ΠΏΠΎΡΠΎΠΌΠΊΠΈ, Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΌ. ΠΠ½ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΡ Π΄ΡΡΠ³ΠΈΡ ΡΠ°ΠΊΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ²Π»ΠΈΡΡΡ Π½Π° ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ². ΠΠ°ΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΡΠΎΡΠ²ΠΈΡΡ ΠΎΡΡΠΎΡΠΎΠΆΠ½ΠΎΡΡΡ, ΡΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ ΠΊΠΎΠ΄Π°, ΡΠΎΠ·Π΄Π°ΡΡΠ΅Π³ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², Π² ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΠΈ Π΄Π»Ρ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡΠΎΡΡΠΉ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎ ΡΡΠ½ΠΊΡΠΈΠΉ wait().
ΠΠ΅ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½Π° ΡΠΈΡ. 9.5.
Π ΠΈΡ. 9.5. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ
ΠΠ° ΡΠΈΡ. 9.5 (Π°) ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π° ΡΠΈΡΡΠ°ΡΠΈΡ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ ΠΊΠ°Π½Π°Π»Π° (ΡΡΡΠΎΠΊΠΈ 22β25) ΠΈ Π΄Π²ΡΡ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² (ΡΡΡΠΎΠΊΠΈ 27β37).
ΠΠ° ΡΠΈΡ. 9.5 (b) ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΡΠΈΡΡΠ°ΡΠΈΡ ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΊΡΡΡΠΈΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΌ ΠΊΠ°Π½Π°Π»Π° (ΡΡΡΠΎΠΊΠΈ 39β40) ΠΈ Π½Π°ΡΠ°Π»Π° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² (ΡΡΡΠΎΠΊΠΈ 42β50). ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠ» ΠΊΠ°Π½Π°Π» Π½Π° ΠΌΠ΅ΡΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ²ΠΎΠ΄Π° (Π»Π΅Π²ΡΠΉ ΠΏΠΎΡΠΎΠΌΠΎΠΊ, ΡΡΡΠΎΠΊΠΈ 61β63) ΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ Π²Π²ΠΎΠ΄Π° (ΡΡΡΠΎΠΊΠΈ 76β78).
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΡΠΈΡ. 9.5 (Ρ) ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΠΈΡΡΠ°ΡΠΈΡ ΠΏΠΎΡΠ»Π΅ Π·Π°ΠΊΡΡΡΠΈΡ ΠΏΠΎΡΠΎΠΌΠΊΠ°ΠΌΠΈ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° (ΡΡΡΠΎΠΊΠΈ 64 ΠΈ 79) ΠΈ Π²ΡΠ·ΠΎΠ²Π° execvp() (ΡΡΡΠΎΠΊΠΈ 66 ΠΈ 81).
9.4.2. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΡΡ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠΎΠ²: /dev/fd/XX
ΠΠ½ΠΎΠ³ΠΈΠ΅ ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ Unix, Π²ΠΊΠ»ΡΡΠ°Ρ GNU/Linux, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ /dev/fd[98] ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ. ΠΡΠΈ ΡΠ°ΠΉΠ»Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΡ ΠΎΡΠΊΡΡΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² Ρ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ /dev/fd/0, /dev/fd/1 ΠΈ Ρ.Π΄. ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ open() Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π½ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ ΡΠ°ΠΉΠ»Π°, ΡΡΠΎ Π² ΡΡΡΠ½ΠΎΡΡΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅ΠΌ ΠΆΠ΅ ΡΠ°ΠΌΡΠΌ, ΡΡΠΎ ΠΈ Π²ΡΠ·ΠΎΠ² dup() Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π½ΠΎΠΌΠ΅ΡΠ° Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°.
ΠΡΠΈ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ Π½Π°Ρ ΠΎΠ΄ΡΡ ΡΠ²ΠΎΠ΅ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ: Bash, ksh88 (Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π²Π΅ΡΡΠΈΠΈ) ΠΈ ksh93 ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π·Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° (process substitution), ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½Π΅Π»ΠΈΠ½Π΅ΠΉΠ½ΡΠ΅ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΡ. ΠΠ° ΡΡΠΎΠ²Π½Π΅ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ Π΄Π»Ρ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π·Π°ΠΏΠΈΡΡ '<(...)', Π° Π΄Π»Ρ Π²ΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° Π·Π°ΠΏΠΈΡΡ '>(...)'. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ diff ΠΊ Π²ΡΠ²ΠΎΠ΄Ρ Π΄Π²ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄. ΠΠ±ΡΡΠ½ΠΎ Π²Π°ΠΌ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ:
command1 > /tmp/out.$$.1
command2 > /tmp/out.$$.2
diff /tmp/out.$$.1 /tmp/out.$$.2
rm /tmp/out.$$.1 /tmp/out.$$.2
Π‘ Π·Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ² ΡΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
diff <(command1) <(command2)
ΠΠ΅ Π½Π°Π΄ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π±Π΅ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π΄Π»Ρ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΡ ΠΈ ΡΠ΄Π°Π»Π΅Π½ΠΈΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ»Π΅Π΄ΡΡΡΠ°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ Π½Π°Ρ Π΄ΠΎΠΌΠ°ΡΠ½ΠΈΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠ»ΠΊΠΎΠΉ Π½Π° Π΄ΡΡΠ³ΠΎΠΉ ΠΊΠ°ΡΠ°Π»ΠΎΠ³:
$ diff <(pwd) <(/bin/pwd)
1c1
< /home/arnold/work/prenhall/progex
---
> /d/home/arnold/work/prenhall/progex
ΠΠ΅Π·Π°ΠΌΡΡΠ»ΠΎΠ²Π°ΡΠ°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° pwd ΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠΉ Π² ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΡ: ΠΎΠ½Π° Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠ΅ΠΊΡΡΠΈΠΉ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΡΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΎΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ cd. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° /bin/pwd ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅Ρ ΠΎΠ±Ρ ΠΎΠ΄ ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ Π΄Π»Ρ Π²ΡΠ²ΠΎΠ΄Π° ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡΡΠΈ.
ΠΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Π·Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²? ΠΠ±ΠΎΠ»ΠΎΡΠΊΠ° ΡΠΎΠ·Π΄Π°Π΅Ρ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ[99] ('pwd' ΠΈ '/bin/pwd'). ΠΡΡ ΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ ΠΏΠΎΠ΄ΡΠΎΠ΅Π΄ΠΈΠ½ΡΠ΅ΡΡΡ ΠΊ ΠΊΠ°Π½Π°Π»Ρ, ΠΏΡΠΈΡΠ΅ΠΌ ΡΠΈΡΠ°Π΅ΠΌΡΠΉ ΠΊΠΎΠ½Π΅Ρ ΠΎΡΠΊΡΡΡ Π² Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π΄Π»Ρ Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ('diff'). ΠΠ°ΡΠ΅ΠΌ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ° ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ Π³Π»Π°Π²Π½ΠΎΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ ΠΈΠΌΠ΅Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ² Π² /dev/fd Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ²ΠΈΠ΄Π΅ΡΡ ΡΡΠΎ, Π²ΠΊΠ»ΡΡΠΈΠ² Π² ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠ΅ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ.
$ set -Ρ /* ΠΠΊΠ»ΡΡΠΈΡΡ ΡΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΡ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ */
$ diff <(pwd) <(/bin/pwd) /* ΠΠ°ΠΏΡΡΡΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ */
+ diff /dev/fd/63 /dev/fd/62 /* Π’ΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ: Π³Π»Π°Π²Π½Π°Ρ,
ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ */
++ pwd /* Π’ΡΠ°ΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ: Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ */
++ /bin/pwd
1c1 /* ΠΡΠ²ΠΎΠ΄ diff */
< /home/arnold/work/prenhall/progex
---
> /d/home/arnold/work/prenhall/progex
ΠΡΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½Π° ΡΠΈΡ. 9.6.
Π ΠΈΡ. 9.6. ΠΠ°ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ°
ΠΡΠ»ΠΈ Π½Π° Π²Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ Π΅ΡΡΡ /dev/fd, Π²Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° ΡΡΠΎΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ, Π±ΡΠ΄ΡΡΠ΅ ΠΎΡΡΠΎΡΠΎΠΆΠ½Ρ ΠΈ Π·Π°Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΡΠΉΡΠ΅ ΡΠΎ, ΡΡΠΎ Π²Ρ Π΄Π΅Π»Π°Π΅ΡΠ΅. ΠΠ°Π½ΠΈΠΏΡΠ»ΡΡΠΈΠΈ Ρ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠΎΠΌ ΡΠ°ΠΉΠ»Π° Π½Π° ΡΡΠΎΠ²Π½Π΅ Π‘ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΠΏΡΠΎΠ·ΡΠ°ΡΠ½Ρ, ΡΠ΅ΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ Π·Π°ΠΏΠΈΡΠΈ ΠΎΠ±ΠΎΠ»ΠΎΡΠΊΠΈ!
9.4.3. Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠ°ΠΌΠΈ ΡΠ°ΠΉΠ»Π°: fcntl()