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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX: взаимодСйствиС процСссов». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 124

Автор Уильям БтивСнс

8. Π’ листингС Π“.3 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Листинг Π“.Π—. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π»ΠΈ fstat количСство Π±Π°ΠΉΡ‚ΠΎΠ² Π² ΠΊΠ°Π½Π°Π»Π΅ FIFO?

//pipe/test1l.c

1  #include "unpipc.h"


2  int

3  main(int argc, char **argv)

4  {

5   int fd[2],

6   char buff[7];

7   struct stat info;

8   if (argc != 2)

9    err_quit("usage: test1 <pathname>");

10  Mkfifo(argv[1], FILE_MODE);

11  fd[0] = Open(argv[1], O_RDONLY | O_NONBLOCK);

12  fd[1] = Open(argv[1], O_WRONLY | O_NONBLOCK);

13  /* 4check sizes when FIFO is empty */

14  Fstat(fd[0], &info);

15  printf("fd[0]: st_size = %ld\n", (long) info.st_size);

16  Fstat(fd[1], &info);

17  printf("fd[1]: st_size = %ld\n", (long) info.st_size);

18  Write(fd[1], buff, sizeof(buff));

19  Fstat(fd[0], &info);

20  printf("fd[0]: st_size = %ld\n", (long) info.st_size);

21  Fstat(fd[1], &info);

22  printf("fd[1]: st_size = %ld\n", (long) info.st_size);

23  exit(0);

24 }

9. Π’Ρ‹Π·ΠΎΠ² select Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ возмоТности записи Π² дСскриптор, Π½ΠΎ Π²Ρ‹Π·ΠΎΠ² write ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ΅ сигнала SIGPIPE. Π­Ρ‚ΠΎ описано Π² ΠΊΠ½ΠΈΠ³Π΅ [24, с. 153-155]; ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ошибка чтСния ΠΈΠ»ΠΈ записи, select Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ дСскриптор доступСн, Π° собствСнно ошибка возвращаСтся ΡƒΠΆΠ΅ Π²Ρ‹Π·ΠΎΠ²Π°ΠΌΠΈ read ΠΈΠ»ΠΈ write. Π’ листингС Π“.4 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏpoΠ³Ρ€aΠΌΠΌΡ‹.

Листинг Π“.4. Π§Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ select ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ†Π° ΠΊΠ°Π½Π°Π»Π°?

//pipe/test2.c

1  #include "unpipc.h"


2  int

3  main(int argc, char **argv)

4  {

5   int fd[2], n;

6   pid_t childpid;

7   fd_set wset;

8   Pipe(fd);

9   if ((childpid = Fork()) == 0) { /* child */

10   printf("child closing pipe read descriptor\n");

11   Close(fd[0]);

12   sleep(6);

13   exit(0);

14  }

15  /* 4parent */

16  Close(fd[0]); /* для двустороннСго ΠΊΠ°Π½Π°Π»Π° */

17  sleep(3);

18  FD_ZERO(&wset);

19  FD_SET(fd[1], &wset);

20  n = select(fd[1] + 1, NULL, &wset, NULL, NULL);

21  printf("select returned %d\n", n);

22  if (FD_ISSET(fd[1], &wset)) {

23   printf("fd[1] writable\n");

24   Write(fd[1], "hello", 5);

25  }

26  exit(0);

27 }

Π“Π»Π°Π²Π° 5

1. Π‘Π½Π°Ρ‡Π°Π»Π° создайтС ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π½Π΅ указывая Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ mq_getattr для получСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π—Π°Ρ‚Π΅ΠΌ ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈ создайтС Π΅Π΅ снова, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для всСх Π½Π΅ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ².

2. Π”ля Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ сообщСния сигнал Π½Π΅ отправляСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ рСгистрация снимаСтся послС ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ сигнала.

3. Π”ля Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ сообщСния сигнал Π½Π΅ отправляСтся, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ этого сообщСния ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π΅ Π±Ρ‹Π»Π° пуста.

4. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ GNU Π‘ Π² систСмС Solaris 2.6 (Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ±Π΅ константы ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ Π²Ρ‹Π·ΠΎΠ²Ρ‹ sysconf) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ошибки:

test1.c:13: warning: int format, long int arg (arg 2)

test1.c:13: warning: int format, long int arg (arg 3)

5. Π’ Solaris 2.6 ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ 1000000 сообщСний ΠΏΠΎ 10 Π±Π°ΠΉΡ‚ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ. ΠŸΡ€ΠΈ этом создаСтся Ρ„Π°ΠΉΠ» Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 20000536 Π±Π°ΠΉΡ‚, Ρ‡Ρ‚ΠΎ соотвСтствуСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏpoΠ³Ρ€aΠΌΠΌΡ‹ 5.4: 10 Π±Π°ΠΉΡ‚ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° сообщСниС, 8 Π±Π°ΠΉΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ), Π΅Ρ‰Π΅ 2 Π±Π°ΠΉΡ‚Π° Π΄ΠΎΠ±Π°Π²ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎ ΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ 4) ΠΈ 536 Π±Π°ΠΉΡ‚ Π΄ΠΎΠ±Π°Π²ΠΎΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° вСсь Ρ„Π°ΠΉΠ». ΠŸΠ΅Ρ€Π΅Π΄ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ mq_open Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ps, равнялся 1052 ΠšΠ±Π°ΠΉΡ‚, Π° послС создания ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ вырос Π΄ΠΎ 20 ΠœΠ±Π°ΠΉΡ‚. Π­Ρ‚ΠΎ заставляСт ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний Posix Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Ρ‡Π΅Ρ€Π΅Π· ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈ mq_open ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ„Π°ΠΉΠ» Π² адрСсноС пространство Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅Π³ΠΎ процСсса. АналогичныС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ Π² Digital Unix 4.0B.

6. Π Π°Π·ΠΌΠ΅Ρ€ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, Ρ€Π°Π²Π½Ρ‹ΠΉ Π½ΡƒΠ»ΡŽ, Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с функциями ANSI Π‘ memXXX. Π’ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π΅ стандарта 1989 Π³ΠΎΠ΄Π° Π₯3.159-1989 (ISO/IEC 9899:1990) Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ ΠΏΠΎ этому ΠΏΠΎΠ²ΠΎΠ΄Ρƒ (ΠΊΠ°ΠΊ ΠΈ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ), Π½ΠΎ Π² Technical Corrigendum Number 1 явно говорится, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° 0 Π½Π΅ Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ (Π½ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΏΡ€ΠΈ этом Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ). Π’ΠΎΠΎΠ±Ρ‰Π΅, Π·Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΏΠΎ языку Π‘ Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΏΠΎ адрСсу http://www.lysator.liu.se/c/.

7. Π”ля двустороннСго взаимодСйствия процСссов трСбуСтся Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний (см. Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, листинг А.15). Если Π±Ρ‹ ΠΌΡ‹ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈ листинг 4.4 для использования ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний Posix вмСсто ΠΊΠ°Π½Π°Π»ΠΎΠ², ΠΌΡ‹ Π±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ процСсс считываСт Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ сам ΠΆΠ΅ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ».

8. Π’Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ условная пСрСмСнная ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹ΠΉ Ρ„Π°ΠΉΠ», совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ всСми процСссами, ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. ΠžΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Π° ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ процСссами, поэтому ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ дСскриптора ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ условная пСрСмСнная Π½Π΅ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ°ΡŽΡ‚ΡΡ.

9. ΠœΠ°ΡΡΠΈΠ²Ρƒ нСльзя ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ массива с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π½Π°ΠΊΠ° равСнства Π² языкС Π‘, Π° Π²ΠΎΡ‚ структурС ΠΌΠΎΠΆΠ½ΠΎ.

10. Ѐункция main ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΉ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ select, оТидая возмоТности чтСния ΠΈΠ· ΠΊΠΎΠ½Ρ†Π° ΠΊΠ°Π½Π°Π»Π°. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ сигнала Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² select, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Ρƒ ошибки EINTR. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, функция-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° Select провСряСт Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ошибки ΠΈ снова Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ select, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС Π“.5. Π’ ΠΊΠ½ΠΈΠ³Π΅ [24, с. 124] Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ рассказ ΠΎ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΈ систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ².

Листинг Π“.5. ΠžΠ±Π΅Ρ€Ρ‚ΠΊΠ° Select, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰Π°Ρ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ EINTR

//lib/wrapunix.c

313 int

314 Select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,

315  struct timeval *timeout)

316 {

317  int n;

318 again:

319  if ( (n = select(nfds, readfds, writefds, exceptfds, timeout)) < 0) {

320   if (errno == EINTR)

321    goto again;

322  else

323   err_sys("select error");

324  } else if (n == 0 && timeout == NULL)

325   err_quit("select returned 0 with no timeout");

326  return(n); /* Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ 0 ΠΏΠΎ Ρ‚Π°ΠΉΠΌ-Π°ΡƒΡ‚Ρƒ */

327 }

Π“Π»Π°Π²Π° 6

1. ΠžΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π² числовом Π²ΠΈΠ΄Π΅ (вмСсто ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ). Π­Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ ΠΏΡƒΡ‚Π΅ΠΌ добавлСния Π½ΠΎΠ²ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΈΠ»ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ прСдполоТСния, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя, состоящСС ΠΈΠ· ΠΎΠ΄Π½ΠΈΡ… Ρ†ΠΈΡ„Ρ€, являСтся Π½Π΅ ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„Π°ΠΉΠ»Π°, Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… ftok, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹ΠΌΠΈ, ΠΎΠ½ΠΈ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ содСрТат ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ Π½Π΅Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ символ (слэш), ΠΈ это ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ являСтся Π²ΠΏΠΎΠ»Π½Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ.

2. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° сообщСний с Ρ‚ΠΈΠΏΠΎΠΌ 0 Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Π°, Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ 1, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ этот ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ процСссу init.

3. ΠŸΡ€ΠΈ использовании СдинствСнной ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π½Π° рис. 6.2 Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ ΠΌΠΎΠ³ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° всС ΠΏΡ€ΠΎΡ‡ΠΈΠ΅ процСссы-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹. Если Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π΅ΡΡ‚ΡŒ своя ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ (рис. 6.3), Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ ΠΏΠΎΡ€Ρ‚ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ свою.

Π“Π»Π°Π²Π° 7

2. Π’Сроятно, процСсс Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒ успССт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹Π·ΠΎΠ² exit Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ всС Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ΡΡ ΠΏΠΎΡ‚ΠΎΠΊΠΈ.

3. Π’ Solaris 2.6 ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚ΠΈΠΏΠ° destroy ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡƒΡ‚Π΅Ρ‡ΠΊΠ΅ памяти, ΠΈΠ· Ρ‡Π΅Π³ΠΎ становится ясно, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ init ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‚ динамичСскоС Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти. Π’ Digital Unix 4.0B Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π½Π΅ Π½Π°Π±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ€Π°Π·Π½ΠΈΡ†Ρƒ Π² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ destroy всС Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎ. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Digital Unix 4.0B ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ пСрСмСнная Ρ‚ΠΈΠΏΠ° attr_t ΠΊΠ°ΠΊ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, содСрТащий Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, Π° Π² Solaris 2.6 эта пСрСмСнная прСдставляСт собой ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° динамичСски создаваСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Π“Π»Π°Π²Π° 9

1. Π’ зависимости ΠΎΡ‚ систСмы ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Ρ‚ΡŒ счСтчик Π΄ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π±ΠΎΠ»ΡŒΡˆΠΈΡ… 20, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

2. Π”ля ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ стандартного ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΡ‹ добавляСм строку

setvbuf(stdout, NULL, _IONBF, 0);

ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main ΠΏΠ΅Ρ€Π΅Π΄ Ρ†ΠΈΠΊΠ»ΠΎΠΌ for. Π­Ρ‚ΠΎ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½ΠΈ Π½Π° Ρ‡Ρ‚ΠΎ Π²Π»ΠΈΡΡ‚ΡŒ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹Π·ΠΎΠ² printf Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈ строка Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ символом ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ стандартный ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π° буфСризуСтся построчно, поэтому Π² любом случаС ΠΎΠ΄ΠΈΠ½ Π²Ρ‹Π·ΠΎΠ² printf прСвращаСтся Π² ΠΎΠ΄ΠΈΠ½ систСмный Π²Ρ‹Π·ΠΎΠ² write.

3. Π—Π°ΠΌΠ΅Π½ΠΈΠΌ printf Π½Π°

snprintf(line, sizeof(line), "%s: pid = 3.1d, seq# = %d\n", argv[0], (long) pid, seqno);

for (ptr = line; (c = *ptr++) != 0) putchar(c);

ΠΈ объявим с ΠΊΠ°ΠΊ Ρ†Π΅Π»ΠΎΠ΅, a ptr β€” ΠΊΠ°ΠΊ char*. Если ΠΌΡ‹ Π²Ρ‹Π·Π²Π°Π»ΠΈ setvbuf для ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ стандартного ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Ρ‹Π²ΠΎΠ΄Π°, Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Π»Π°Ρ‚ΡŒ систСмный Π²Ρ‹Π·ΠΎΠ² для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа. На это трСбуСтся большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ ядру большС возмоТностСй Π½Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ контСкста ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами. Вакая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π΄Π°Π²Π°Ρ‚ΡŒ большС ошибок.

4. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ нСсколько процСссов ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Π°, Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это эквивалСнтно ΠΏΠΎΠ»Π½ΠΎΠΌΡƒ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ.

5. ΠΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ измСнится, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„Π»Π°Π³ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ для дСскриптора Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ влияСт Π½Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ fcntl. Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ процСсса ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ fcntl опрСдСляСтся Ρ‚ΠΈΠΏΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹: F_SETLKW (которая блокируСтся всСгда) ΠΈΠ»ΠΈ F_SETLK (которая Π½Π΅ блокируСтся Π½ΠΈΠΊΠΎΠ³Π΄Π°).