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

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

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

Бтандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для считывания ΠΈ записи Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΏpoΠ³Ρ€aΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» ΠΈΠ»ΠΈ FIFO. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°Π½Π°Π» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ piΡ€Π΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π΅ΠΉ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ дСскриптор, для создания Π½ΠΎΠ²ΠΎΠ³ΠΎ стандартного ΠΏΠΎΡ‚ΠΎΠΊΠ°, связанного с этим дСскриптором, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fdopen. Канал FIFO ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π΅ΠΌ, поэтому ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fopen.

МоТно ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ Π±ΠΎΠ»Π΅Π΅ структурированныС сообщСния β€” эта Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ прСдоставляСтся очСрСдями сообщСний ΠΈ Π² Posix, ΠΈ Π² System V. ΠœΡ‹ вскорС ΡƒΠ·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ сообщСниС ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Π΄Π»ΠΈΠ½ΠΎΠΉ ΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ (Ρ‚ΠΈΠΏΠΎΠΌ Π² System V). Π”Π»ΠΈΠ½Π° ΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»Π΅ΠΌ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŽ послС считывания сообщСния. КаТдоС сообщСниС прСдставляСт собой запись, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ Π΄eΠΉΡ‚aΠ³Ρ€aΠΌΠΌaΠΌ UDP ([24]).

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌΡƒ ΠΊΠ°Π½Π°Π»Ρƒ ΠΈΠ»ΠΈ FIFO, ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠΌ сообщСниС Π² нашСм Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ mesg.h, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 4.12.

Листинг 4.12. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° mymesg ΠΈ ΡΠΎΠΏΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ опрСдСлСния

//pipemesg/mesg.h

1  #include "unpipc.h"

2  /* Наши собствСнныС "сообщСния", ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ с ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ, FIFO ΠΈ очСрСдями сообщСний */

3  /* ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ sizeof(struct mymesg) <= PIPE_BUF */

4  #define MAXMESGDATA (PIPE_BUF – 2*sizeof(long))

5  /* Π”Π»ΠΈΠ½Π° mesg_len ΠΈ mesg_type */

6  #define MESGHDRSIZE (sizeof(struct mymesg) – MAXMESGDATA)

7  struct mymesg {

8   long mesg_len; //количСство Π±Π°ΠΉΡ‚ΠΎΠ² Π² mesg_data, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ О

9   long mesg_type;//Ρ‚ΠΈΠΏ сообщСния, Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ > 0

10  char mesg_data[MAXMESGDATA];

11 };

12 ssize_t mesg_send(int, struct mymesg *);

13 void Mesg_send(int, struct mymesg *);

14 ssize_t mesg_recv(int, struct mymesg *);

15 ssize_t Mesg_recv(int, struct mymesg *);

КаТдоС сообщСниС содСрТит Π² сСбС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ своСм Ρ‚ΠΈΠΏΠ΅ (mesg_type), ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ большС нуля. Пока ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ это ΠΏΠΎΠ»Π΅ Π² записи, Π½ΠΎ вСрнСмся ΠΊ Π½Π΅ΠΌΡƒ Π² Π³Π»Π°Π²Π΅ 6, Π³Π΄Π΅ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний System V. КаТдоС сообщСниС Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Π΄Π»ΠΈΠ½ΠΎΠΉ, ΠΊoΡ‚opая ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° mymesg позволяСт ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ сообщСниС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ΅ ΠΈ Π΄Π»ΠΈΠ½Π΅ вмСсто использования символа ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки для сигнализации ΠΊΠΎΠ½Ρ†Π° сообщСния. Π Π°Π½Π΅Π΅ ΠΌΡ‹ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ Π΄Π²Π° прСимущСства этого ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°: ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС принятыС Π±Π°ΠΉΡ‚Ρ‹ Π² поисках ΠΊΠΎΠ½Ρ†Π° сообщСния ΠΈ отсутствуСт Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ появлСниС раздСлитСля Π² самих Π΄Π°Π½Π½Ρ‹Ρ….

На рис. 4.13 ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ Π²ΠΈΠ΄ структуры mymesg ΠΈ Π΅Π΅ использованиС с ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ, FIFO ΠΈ очСрСдями сообщСний System V. 

Рис. 4.13. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° mymesg


ΠœΡ‹ опрСдСляСм Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ° сообщСний. Π’ листингС 4.13 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mesg_send, Π° Π² листингС 4.14 β€” Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mesg_recv.

Листинг 4.13. Ѐункция mesg_send

//pipemesg/mesg_send.c

1 #include "mesg.h"

2 ssize_t

3 mesg_send(int fd, struct mymesg *mptr)

4 {

5  return(write(fd, mptr, MESGHDRSIZE + mptr->mesg_len));

6 }

Листинг 4.14. Ѐункция mesg_recv

//pipemesg/mesg_recv.c

1  #include "mesg.h"

2  ssize_t

3  mesg_recv(int fd, struct mymesg *mptr)

4  {

5   size_t len;

6   ssize_t n;

8   /* считываниС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° сообщСния для опрСдСлСния Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Ρ‹ */

9   if ((n = Read(fd, mptr, MESGHDRSIZE)) == 0)

10   return(0); /* end of file */

11  else if (n != MESGHDRSIZE)

12   err_quit("message header: expected %d, got %d". MESGHDRSIZE, n);

13  if ((len = mptr->mesg_len) > 0)

14   if ((n = Read(fd, mptr->mesg_data, len)) != len)

15    err_quit("message data: expected %d, got %d", len, n);

16  return(len);

17 }

Π’Π΅ΠΏΠ΅Ρ€ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сообщСния функция read вызываСтся Π΄Π²Π°ΠΆΠ΄Ρ‹: ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· для считывания Π΄Π»ΠΈΠ½Ρ‹, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” для считывания самого сообщСния (Ссли Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Π° большС 0).

ΠŸΠ Π˜ΠœΠ•Π§ΠΠΠ˜Π•

Π’Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³Π»ΠΈ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ функция mesg_recv провСряСт Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ошибок ΠΈ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΡ€ΠΈ ΠΈΡ… ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠΈ. Однако ΠΌΡ‹ всС ΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΡƒ Mesg_recv ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΈΠ· Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΅Π΅ β€” для Сдинообразия.

ИзмСним Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ client ΠΈ server, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½ΠΎΠ²Ρ‹ΠΌΠΈ функциями mesg_send ΠΈ mesg_recv. Π’ листингС 4.15 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

Листинг 4.15. Ѐункция client с использованиСм сообщСний

//pipemesg/client.c

1  #include "mesg.h"

2  void

3  client(int readfd, int writefd)

4  {

5   size_t len;

6   ssize_t n;

7   struct mymesg mesg;

8   /* считываниС ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ */

9   Fgets(mesg.mesg_data, MAXMESGDATA, stdin);

10  len = strlen(mesg.mesg_data);

11  if (mesg.mesg_data[len-1] == '\n')

12   len--; /* ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки ΠΈΠ· fgets() */

13  mesg.mesg_len = len;

14  mesg.mesg_type = 1;

15  /* запись ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Π² ΠΊΠ°Π½Π°Π» IPC */

16  Mesg_send(writefd, &mesg);

17  /* считываниС ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° IPC. запись Π² stdout */

18  while ( (n = Mesg_recv(readfd, &mesg)) > 0)

19   Write(STDOUT_FILENO, mesg.mesg_data, n);

20 }

Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π΅Π³ΠΎ сСрвСру

8-16 ПолноС имя считываСтся ΠΈΠ· стандартного ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π° ΠΈ Π·Π°Ρ‚Π΅ΠΌ отправляСтся Π½Π° сСрвСр с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mesg_send.

Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΠ΅ содСрТимого Ρ„Π°ΠΉΠ»Π° ΠΈΠ»ΠΈ сообщСния ΠΎΠ± ошибкС ΠΎΡ‚ сСрвСра

17-19 ΠšΠ»ΠΈΠ΅Π½Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ mesg_recv Π² Ρ†ΠΈΠΊΠ»Π΅, считывая всС приходящиС ΠΎΡ‚ сСрвСра сообщСния. По соглашСнию, ΠΊΠΎΠ³Π΄Π° mesg_recv Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΡƒΠ»Π΅Π²ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ сообщСния, это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠ½Π΅Ρ† ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… сСрвСром Π΄Π°Π½Π½Ρ‹Ρ…. ΠœΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ сСрвСр добавляСт символ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΡΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΡŽ, отправляСмому ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, поэтому пустая строка Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ сообщСния 1. Π’ листингС 4.16 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-сСрвСра.

Листинг 4.16. Ѐункция server, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ сообщСния

//pipemesg/server.c

1  #include "mesg.h"

2  void

3  server(int readfd, int writefd)

4  {

5   FILE *fp;

6   ssize_t n;

7   struct mymesg mesg;

8   /* считываниС ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° */

9   mesg.mesg_type = 1;

10  if ((n = Mesg_recv(readfd, &mesg)) == 0)

11   err_quit("pathname missing");

12  mesg.mesg_data[n] = '\0'; /* ΠΏΠΎΠ»Π½ΠΎΠ΅ имя, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π΅ΡΡ 0 */

13  if ((fp = fopen(mesg.mesg_data, "r")) == NULL) {

14   /* ошибка, Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ */

15   snprintf(mesg.mesg_data + n, sizeof(mesg.mesg_data) – n,

16    ": can't open, %s\n", strerror(errno));

17   mesg.mesg_len = strlen(mesg.mesg_data);

18   Mesg_send(writefd, &mesg);

19  } else {

20   /* Ρ„Π°ΠΉΠ» ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π°Π½Π½Ρ‹Ρ… */

21   while (Fgets(mesg.mesg_data, MAXMESGDATA, fp) != NULL) {

22    mesg.mesg_len = strlen(mesg.mesg_data);

23    Mesg_send(writefd, &mesg);

24   }

25   Fclose(fp);

26  }

27  /* ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСния Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ для обозначСния ΠΊΠΎΠ½Ρ†Π° связи */

28  mesg.mesg_len = 0;

29  Mesg_send(writefd, &mesg);

30 }

Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° IPC, ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°

8-18 Π‘Π΅Ρ€Π²Π΅Ρ€ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° имя Ρ„Π°ΠΉΠ»Π°. Π₯отя Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ mesg_type, Ρ€Π°Π²Π½ΠΎΠ΅ 1, Π½ΠΈΠ³Π΄Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ (ΠΎΠ½ΠΎ затираСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ mesg_recv ΠΈΠ· листинга 4.14), ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Ρƒ ΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с очСрСдями сообщСний System V (листинг 6.8), Π° Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π² этом Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΈ ΡƒΠΆΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ (см., Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, листинг 6.11). Бтандартная функция Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° fopen ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ», Ρ‡Ρ‚ΠΎ отличаСтся ΠΎΡ‚ листинга 4.3, Π³Π΄Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π»Π°ΡΡŒ функция open для получСния дСскриптора Ρ„Π°ΠΉΠ»Π°. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ воспользовались fopen, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² этой ΠΏpoΠ³Ρ€aΠΌΠΌe ΠΌΡ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ fgets для считывания содСрТимого Ρ„Π°ΠΉΠ»Π° построчно ΠΈ Π·Π°Ρ‚Π΅ΠΌ отправляСм ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ строку Π·Π° строкой.

ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Ρ„Π°ΠΉΠ»Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ

19-26 Если Π²Ρ‹Π·ΠΎΠ² fopen оказываСтся ΡƒΡΠΏΠ΅ΡˆΠ½Ρ‹ΠΌ, содСрТимоС Ρ„Π°ΠΉΠ»Π° считываСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ fgets ΠΈ Π·Π°Ρ‚Π΅ΠΌ отправляСтся ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ построчно. Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ с Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½ΠΎΠΉ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°.

ΠŸΡ€ΠΈ использовании ΠΏpoΠ³Ρ€aΠΌΠΌΠ½Ρ‹x ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΈΠ»ΠΈ FIFO ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΊΠ°Π½Π°Π» IPC, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Π·Π½Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Ρ„Π°ΠΉΠ»Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°. Однако ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ сообщСния Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ IPC Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ ΠΊΠΎΠ½Ρ†Π° Ρ„Π°ΠΉΠ»Π°.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ main, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ client ΠΈ server, Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΏΡ€Π΅Ρ‚Π΅Ρ€ΠΏΠ΅Π»ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ Π²Π΅Ρ€ΡΠΈΡŽ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ (листинг 4.1), Π»ΠΈΠ±ΠΎ Π²Π΅Ρ€ΡΠΈΡŽ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с FIFO (листинг 4.6).

4.11. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΈ FIFO

На ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ ΠΈ ΠΊΠ°Π½Π°Π»Ρ‹ FIFO систСмой Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ всСго Π΄Π²Π° ограничСния:

β–  OPEN_MAX β€” максимальноС количСство дСскрипторов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ процСссом (Posix устанавливаСт для этой Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ снизу β€” 16);

β–  PIPE_BUF β€” максимальноС количСство Π΄Π°Π½Π½Ρ‹Ρ…, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ гарантируСтся Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ записи (описано Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 4.7; Posix Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΠΎ мСньшСй ΠΌΠ΅Ρ€Π΅ 512 Π±Π°ΠΉΡ‚).