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

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

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

//svmsgcliserv/svmsg.h

1 #include "unpipc.h"

2 #define MQ_KEY1 1234L

3 #define MQ_KEY2 2345L

Ѐункция main для сСрвСра ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² листингС 6.8. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° создаСт ΠΎΠ±Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний, ΠΈ Π½Π΅ Π±Π΅Π΄Π°, Ссли какая-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΈΠ· Π½ΠΈΡ… ΡƒΠΆΠ΅ сущСствуСт, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„Π»Π°Π³ IPC_EXCL. Ѐункция server Π΄Π°Π½Π° Π² листингС 4.16. Она Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ наши собствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mesgsend ΠΈ mesgrecv, Π½ΠΎΠ²Ρ‹Π΅ вСрсии ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½ΠΈΠΆΠ΅.

Листинг 6.8. Ѐункция main ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹-сСрвСра, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний

//svmsgcliserv/server_main.с

1  #include "svmsg.h"


2  void server(int, int);

3  int

4  main(int argc, char **argv)

5  {

6   int readid, writeid;

7   readid = Msgget(MQ_KEY1, SVMSG_MODE | IPC_CREAT);

8   writeid = Msgget(MQ_KEY2, SVMSG_MODE | IPC_CREAT);

9   server(readid, writeid);

10  exit(0);

11 }

Листинг 6.9. Ѐункция main ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний

//svmsgcliserv/client_main.с

1  #include "svmsg.h"

2  void client(int, int);


3  int

4  main(int argc, char **argv)

5  {

6   int readid, writeid;

7   /* assumes server has created the queues */

8   writeid = Msgget(MQ_KEY1, 0);

9   readid = Msgget(MQ_KEY2, 0);

10  client(readid, writeid);

11  /* now we can delete the queues */

12  Msgctl(readid, IPC_RMID. NULL);

13  Msgctl(writeid, IPC_RMID, NULL);

14  exit(0);

15 }

Π’ листингС 6.9 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹-ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ Π΄Π²Π΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ client ΠΈΠ· листинга 4.15. Π­Ρ‚Π° функция ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π΄Π²Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅: mesg_send ΠΈ mesg_recv, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½ΠΈΠΆΠ΅.

И функция client, ΠΈ функция server ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ сообщСний, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹ΠΉ Π² листингС 4.12. Для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ° сообщСний ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mesg_send ΠΈ mesg_recv. Π‘Ρ‚Π°Ρ€Ρ‹Π΅ вСрсии этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π² листингах 4.13 ΠΈ 4.14, Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΈ write ΠΈ read ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌΠΈ ΠΊΠ°Π½Π°Π»Π°ΠΌΠΈ ΠΈ FIFO, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ придСтся ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΡ… для использования ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний. Π’ листингах 6.10 ΠΈ 6.11 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½ΠΎΠ²Ρ‹Π΅ вСрсии этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π΅ измСнились, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ цСлочислСнный Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ цСлочислСнный дСскриптор ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° ΠΈΠ»ΠΈ FIFO, Ρ‚Π°ΠΊ ΠΈ цСлочислСнный дСскриптор ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний.

Листинг 6.10. Ѐункция mesg_send, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π°Ρ с ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ сообщСний System V

//svmsgcliserv/mesg_send.с

1 #include "mesg.h"


2 ssize_t

3 mesg_send(int id, struct mymesg *mptr)

4 {

5  return(msgsnd(id, &(mptr->mesg_type), mptr->mesg_len, 0));

6 }

Листинг 6.11. Ѐункция mesg_recv, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π°Ρ с ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ сообщСний System V

//svmsgcliserv/mesg_recv.с

1 #include "mesg.h"


2 ssize_t

3 mesg_recv(int id, struct mymesg *mptr)

4 {

5  ssize_t n;

6  n = msgrcv(id, &(mptr->mesg_type), MAXMESGDATA, mptr->mesg_type, 0);

7  mptr->mesg_len = n; /* количСство Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… */

8  return(n); /* –1 Π² случаС ошибки, 0 – ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°, ΠΈΠ½Π°Ρ‡Π΅ – >0 */

9 }

6.8. ΠœΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сообщСний

НаличиС поля type Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сообщСния Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ прСдоставляСт Π΄Π²Π΅ интСрСсныС возмоТности:

1. ПолС type ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ сообщСний, позволяя нСскольким процСссам ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сообщСния Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. НапримСр, всС сообщСния ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² сСрвСру ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ°, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ сообщСния сСрвСра ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ значСния Ρ‚ΠΈΠΏΠΎΠ², ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. ЕстСствСнно, Π² качСствС значСния Ρ‚ΠΈΠΏΠ° сообщСния, Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

2. ПолС type ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для установки ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° сообщСний. Π­Ρ‚ΠΎ позволяСт ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŽ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ сообщСния Π² порядкС, ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠΌ ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ для ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ (FIFO). Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… ΠΊΠ°Π½Π°Π»Π°Ρ… ΠΈ FIFO Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³Π»ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹. ΠžΡ‡Π΅Ρ€Π΅Π΄ΠΈ System V ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ сообщСния Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΌ порядкС Π² зависимости ΠΎΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° сообщСний. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ msgrcv с Ρ„Π»Π°Π³ΠΎΠΌ IPC_NOWAIT для считывания сообщСний с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΈ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ³ΠΎ возвращСния управлСния процСссу Π² случаС отсутствия Ρ‚Π°ΠΊΠΈΡ… сообщСний.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΎΠ΄Π½Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

ВспомнитС наш простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с ΠΎΠ΄Π½ΠΈΠΌ процСссом-сСрвСром ΠΈ ΠΎΠ΄Π½ΠΈΠΌ процСссом-ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ. Если ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΊΠ°Π½Π°Π»Ρ‹ ΠΈΠ»ΠΈ FIFO, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π΄Π²ΡƒΡ… ΠΊΠ°Π½Π°Π»ΠΎΠ² IPC для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΎΠ±ΠΎΠΈΡ… направлСниях, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эти Ρ‚ΠΈΠΏΡ‹ IPC ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌΠΈ. ΠžΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΎΠ±ΠΎΠΈΡ… направлСниях, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΏΠΎΠ»Π΅ type ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для указания адрСсата (ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈΠ»ΠΈ сСрвСра).

Рис. 6.2. ΠœΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сообщСний ΠΌΠ΅ΠΆΠ΄Ρƒ нСсколькими ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΈ ΠΎΠ΄Π½ΠΈΠΌ сСрвСром


Рассмотрим услоТнСнный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚: ΠΎΠ΄ΠΈΠ½ сСрвСр ΠΈ нСсколько ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ². Π’ этом случаС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° 1, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для обозначСния сообщСний ΠΎΡ‚ любого ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° сСрвСру. Если ΠΊΠ»ΠΈΠ΅Π½Ρ‚ пСрСдаст сСрвСру свой ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса Π² качСствС части сообщСния, сСрвСр смоТСт ΠΎΡ‚ΡΡ‹Π»Π°Ρ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ сообщСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΅Π³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π² качСствС значСния Ρ‚ΠΈΠΏΠ° сообщСния. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свой PID Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° type ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ msgrcv. На рис. 6.2 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ для ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΏΠ»Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ этих сообщСний ΠΌΠ΅ΠΆΠ΄Ρƒ нСсколькими ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΈ ΠΎΠ΄Π½ΠΈΠΌ сСрвСром.

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

ΠŸΡ€ΠΈ использовании ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° IPC ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΈ сСрвСром всСгда сущСствуСт ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ зависания (deadlock). ΠšΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ (Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅) Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ своими сообщСниями, Π½Π΅ давая сСрвСру возмоТности ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚. Π’ этому случаС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ msgsnd, ΠΊΠ°ΠΊ ΠΈ сСрвСр. Одно ΠΈΠ· соглашСний, ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΡ… Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сСрвСр Π΄ΠΎΠ»ΠΆΠ΅Π½ всСгда ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ записи Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π΅Π»Π°Ρ‚ΡŒ наш ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ ΠΈ сСрвСром, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΠ΄Π½Ρƒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний с Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ для Ρ€Π°Π·Π½Ρ‹Ρ… адрСсатов. Π­Ρ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ соглашСниС: сообщСния с Ρ‚ΠΈΠΏΠΎΠΌ 1 адрСсованы сСрвСру, Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ сообщСния ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚ΠΈΠΏ, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ процСсса адрСсата. ΠŸΡ€ΠΈ этом запрос ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΅Π³ΠΎ PID вмСстС с ΠΏΠΎΠ»Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 4.8.

Π’ листингС 6.12 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main сСрвСра. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» svmsg.h Π±Ρ‹Π» ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 6.7. БоздаСтся СдинствСнная ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний (Ссли ΠΎΠ½Π° сущСствуСт, ошибки Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½Π΅Ρ‚). Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ этой ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС ΠΎΠ±ΠΎΠΈΡ… Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ server.

Листинг 6.12. Ѐункция main сСрвСра

//svmsgmpx1q/server_main.с

1  #include "svmsg.h"

2  void server(int, int);


3  int

4  main(int argc, char **argv)

5  {

6   int msqid;

7   msqid = Msgget(MQ_KEY1, SVMSG_MODE | IPC_CREAT);

8   server(msqid, msqid); /* ΠΎΠ΄Π½Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π² ΠΎΠ±Π΅ стороны */

9   exit(0);

10 }

Ѐункция server обСспСчиваСт Ρ€Π°Π±ΠΎΡ‚Ρƒ сСрвСра. Π•Π΅ тСкст ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π² листингС 6.13. Π­Ρ‚Π° функция прСдставляСт собой ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ листинга 4.10 β€” нашСго сСрвСра FIFO, ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Π²ΡˆΠ΅Π³ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΡΠΎΡΡ‚ΠΎΡΠ²ΡˆΠΈΠ΅ ΠΈΠ· ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° процСсса ΠΈ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π°, β€” ΠΈ листинга 4.16, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ использовались Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mesg_send ΠΈ mesg_recv. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса, отправляСмый ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС Ρ‚ΠΈΠΏΠ° для всСх сообщСний, отправляСмых сСрвСром этому ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ. Π­Ρ‚Π° функция прСдставляСт собой бСсконСчный Ρ†ΠΈΠΊΠ», Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ запросы ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈ ΠΎΡ‚ΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π·Π°ΠΏΡ€ΠΎΡˆΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹. Π­Ρ‚ΠΎΡ‚ сСрвСр являСтся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ (см. Ρ€Π°Π·Π΄Π΅Π» 4.9).

Π’ листингС 6.14 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. ΠšΠ»ΠΈΠ΅Π½Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний, которая Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Π»Π° Π±Ρ‹Ρ‚ΡŒ создана сСрвСром Π·Π°Ρ€Π°Π½Π΅Π΅.

Ѐункция client, тСкст ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄Π°Π½ Π² листингС 6.15, обСспСчиваСт всю ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ со стороны ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°. Π­Ρ‚Π° функция прСдставляСт собой ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈΠ· листингов 4.11 ΠΈ 4.15. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ отсылал свой ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈ ΠΏΠΎΠ»Π½ΠΎΠ΅ имя Ρ„Π°ΠΉΠ»Π°, Π° Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ использовались Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mesg_send ΠΈ mesg_recv. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ сообщСний, Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ mesg_recv, совпадаСт с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ процСсса ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ client ΠΈ server ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mesg_send ΠΈ mesg_recv ΠΈΠ· листингов 6.9 ΠΈ 6.11.

Листинг 6.13. Ѐункция server

//svmsgmpx1q/server.c

1  #include "mesg.h"


2  void

3  server(int readfd, int writefd)

4  {

5   FILE *fp;

6   char *ptr;

7   pid_t pid;

8   ssize_t n;

9   struct mymesg mesg;

10  for (;;) {

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