Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 80

Автор ΠΡ€Π½ΠΎΠ»ΡŒΠ΄ Роббинс

Когда Π»Π΅Π²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΎΠ½ заканчиваСтся. БистСма послС этого Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ всС Π΅Π³ΠΎ дСскрипторы Ρ„Π°ΠΉΠ»ΠΎΠ². Когда это случаСтся, ΠΏΡ€Π°Π²Ρ‹ΠΉ ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ счСтС ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π° ΠΈ Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΈ Π²Ρ‹ΠΉΡ‚ΠΈ.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, 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()