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

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

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

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° len Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mq_receive Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Π½Π΅ мСньшС максимального Ρ€Π°Π·ΠΌΠ΅Ρ€Π° сообщСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΎ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ значСния поля mq_msgsize структуры mq_attr для этой ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Если len оказываСтся мСньшС этой Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹, Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ возвращаСтся ошибка EMSGSIZE. 

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

Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Ρƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний Posix, придСтся Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ mq_getattr послС открытия ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ для опрСдСлСния максимального Ρ€Π°Π·ΠΌΠ΅Ρ€Π° сообщСния, Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π΄Π΅Π»ΡΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² чтСния этого Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. Π’Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±ΡƒΡ„Π΅Ρ€ Π±Ρ‹Π» большС ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ, Ρ‡Π΅ΠΌ максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ сообщСниС, позволяСт Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mq_receive Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ письма ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ объСм Π±ΡƒΡ„Π΅Ρ€Π°. Π‘Ρ€Π°Π²Π½ΠΈΡ‚Π΅ это, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с Ρ„Π»Π°Π³ΠΎΠΌ MSG_NOERROR ΠΈ ошибкой E2BIG для ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний System V (Ρ€Π°Π·Π΄Π΅Π» 6.4) ΠΈ Ρ„Π»Π°Π³ΠΎΠΌ MSG_TRUNC для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ recvmsg, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ с Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ UDP (Ρ€Π°Π·Π΄Π΅Π» 13.5 [24]). 

АргумСнт prio устанавливаСт ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ сообщСния для mq_send, Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ мСньшС MQ_PRIO_MAX. Если ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ mq_receive priop являСтся Π½Π΅Π½ΡƒΠ»Π΅Π²Ρ‹ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ, Π² Π½Π΅ΠΌ сохраняСтся ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ сообщСния. Если ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π½Π΅ трСбуСтся использованиС Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠ² сообщСний, ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π²Π½Ρ‹ΠΌ Π½ΡƒΠ»ΡŽ для mq_send ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ mq_receive Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π² качСствС послСднСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.

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

Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° сообщСний Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹. Π­Ρ‚ΠΎ Ρ‚ΠΎΡ‚ случай, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΆΠ½ΠΎ Π½Π΅ Ρ‚ΠΎ, ΠΎ Ρ‡Π΅ΠΌ говорится Π² стандартС (Posix.1), Π° Ρ‚ΠΎ, ΠΎ Ρ‡Π΅ΠΌ Π² Π½Π΅ΠΌ Π½Π΅ говорится: Π½ΠΈΠ³Π΄Π΅ Π½Π΅ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° сообщСний Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹. Ѐункция mq_receive Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство Π±Π°ΠΉΡ‚ΠΎΠ² Π² сообщСнии (Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹) ΠΈΠ»ΠΈ –1 Π² случаС возникновСния ошибок, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ 0 ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ сообщСниС Π½ΡƒΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹. 

ΠžΡ‡Π΅Ρ€Π΅Π΄ΡΠΌ сообщСний Posix ΠΈ System V Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ отправитСля сообщСния. Π­Ρ‚Π° информация ΠΌΠΎΠ³Π»Π° Π±Ρ‹ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠΌ прилоТСниям. К соТалСнию, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠ² ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ сообщСний IPC Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ отправитСля сообщСний. Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 15.5 ΠΌΡ‹ расскаТСм, ΠΊΠ°ΠΊ эта Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ обСспСчиваСтся для Π΄Π²Π΅Ρ€Π΅ΠΉ. Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 14.8 [24] описано, ΠΊΠ°ΠΊ эта Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ обСспСчиваСтся Π² BSD/OS для Π΄ΠΎΠΌΠ΅Π½Π½Ρ‹Ρ… сокСтов Unix. Π’ Ρ€Π°Π·Π΄Π΅Π»Π΅ 15.3.1 [21] описано, ΠΊΠ°ΠΊ SVR4 ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»Π΅ ΠΏΠΎ ΠΊΠ°Π½Π°Π»Ρƒ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΏΠΎ Π½Π΅ΠΌΡƒ дСскриптора. Π’ настоящСС врСмя ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ BSD/OS ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, ΠΈ хотя рСализация SVR4 являСтся Ρ‡Π°ΡΡ‚ΡŒΡŽ стандарта Unix 98, ΠΎΠ½Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ дСскриптора ΠΏΠΎ ΠΊΠ°Π½Π°Π»Ρƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ являСтся Π±ΠΎΠ»Π΅Π΅ дорогостоящСй ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ, Ρ‡Π΅ΠΌ просто ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° Π΄Π°Π½Π½Ρ‹Ρ…. ΠœΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»ΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ сСбС (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, эффСктивный ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ) Π² самом сообщСнии, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ эта информация окаТСтся истинной. Π₯отя Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ доступа ΠΊ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚, ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ ΠΏΡ€Π°Π²ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»ΡŒ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Π² Π½Π΅Π΅ сообщСния, это всС Ρ€Π°Π²Π½ΠΎ Π½Π΅ Π΄Π°Π΅Ρ‚ однозначности. БущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ отправитСля (ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ рассказываСтся Π² связи с очСрСдями System V Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 6.8), Π½ΠΎ это ΠΏΠ»ΠΎΡ…ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. НаконСц, Ссли Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с очСрСдями сообщСний Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ 5.8), Π° Π½Π΅ ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ ядра, ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎΠ± ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»Π΅, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ с сообщСниСм, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π΅Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ΄Π΄Π΅Π»Π°Ρ‚ΡŒ. 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° mqsend

Π’ листингС 5.5 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‰Π΅ΠΉ сообщСниС Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ.

Листинг 5.5. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° mqsend

//pxmsg/mqsend.c

1  #include "unpipc.h"

2  int

3  main(int argc, char **argv)

4  {

5   mqd_t mqd;

6   void *ptr;

7   size_t len;

8   uint_t prio;

9   if (argc != 4)

10   err_quit("usage: mqsend <name> <#bytes> <priority>");

11  len = atoi(argv[2]);

12  prio = atoi(argv[3]);

13  mqd = Mq_open(argv[1], O_WRONLY);

14  ptr = Calloc(len, sizeof (char));

15  Mq_send(mqd, ptr, len, prio);

16  exit(0);

17 }

И Ρ€Π°Π·ΠΌΠ΅Ρ€ сообщСния, ΠΈ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. Π‘ΡƒΡ„Π΅Ρ€ ΠΏΠΎΠ΄ сообщСниС выдСляСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ callос, которая ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π½ΡƒΠ»Π΅ΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° mqreceive

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π² листингС 5.6 считываСт сообщСниС ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

Листинг 5.6. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° mqreceive

//pxmsg/mqreceive.с

1  #include "unpipc.h"

2  int

3  main(int argc, char **argv)

4  {

5   int с flags;

6   mqd_t mqd;

7   ssize_t n;

8   uint_t prio;

9   void *buff;

10  struct mq_attr attr;

11  flags = O_RDONLY;

12  while ((c = Getopt(argc, argv, "n")) != –1) {

13   switch (c) {

14   case 'n':

15    flags |= O_NONBLOCK;

16    break;

17   }

18  }

19  if (optind != argc – 1)

20   err_quit("usage: mqreceive [ –n ] <name>");

21  mqd = Mq_open(argv[optind], flags);

22  Mq_getattr(mqd, &attr);

23  buff = Malloc(attr.mqjnsgsize);

24  n = Mq_receive(raqd, buff, attr.mq_msgsize, &prio);

25  printf("read %ld bytes, priority = %u\n", (long) n, prio);

26  exit(0);

27 }

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ -n Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ

14-17 ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки –n ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ. ΠŸΡ€ΠΈ этом ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ сообщСниС ΠΎΠ± ошибкС, Ссли Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π½Π΅Ρ‚ сообщСний.

ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²

21-25 ΠœΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π΅Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, Π²Ρ‹Π·Π²Π°Π² mq_getattr. Нам ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ сообщСния, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ Π±ΡƒΡ„Π΅Ρ€ подходящСго Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ mq_receive. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ считываСмого сообщСния ΠΈ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚.

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

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ n ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ size_t ΠΈ ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ, int это ΠΈΠ»ΠΈ long, ΠΌΡ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ эту Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρƒ ΠΊ Ρ‚ΠΈΠΏΡƒ long ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ строку Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° %ld. Π’ 64-разрядной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ int Π±ΡƒΠ΄Π΅Ρ‚ 32-разрядным Ρ†Π΅Π»Ρ‹ΠΌ, a long ΠΈ size_t Π±ΡƒΠ΄ΡƒΡ‚ 64-разрядными Ρ†Π΅Π»Ρ‹ΠΌΠΈ.

Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΎΠ±Π΅ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ использованиС поля ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°.

solaris % mqcreate /test1

solaris % mqgetattr /test1        создаСм ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈ смотрим Π½Π° Π΅Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹

max #msgs = 128, max #bytes/msg = 1024, #currently on queue = 0

solaris % mqsend /test1 100 99999 ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° с Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°

mq_send error: Invalid argument

solaris % mqsend /test1 100 6     100 Π±Π°ΠΉΡ‚, ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ 6

solaris % mqsend /test1 50 18     50 Π±Π°ΠΉΡ‚, ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ 18

solaris % mqsend /test1 33 18     33 Π±Π°ΠΉΡ‚, ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ 18

solaris % mqreceive /test1

read 50 bytes, priority = 18         возвращаСтся ΡΡ‚Π°Ρ€Π΅ΠΉΡˆΠ΅Π΅ сообщСниС с

solaris % mqreceive /test1        Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ

read 33 bytes, priority = 18

Solaris % mqreceive /test1

read 100 bytes, priority = 6

Solaris % mqreceive –n /test1     ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΈ убСТдаСмся, Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ пуста

mq_receive error: Resource temporarily unavailable

ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ mq_receive Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΡ‚Π°Ρ€Π΅ΠΉΡˆΠ΅Π΅ сообщСниС с Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ. 

5.5. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний

ΠœΡ‹ ΡƒΠΆΠ΅ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡŒ с двумя ограничСниями, устанавливаСмыми для любой ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Π΅ создания:

β–  mq_maxmsg β€” максимальноС количСство сообщСний Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ;

β–  mq_msgsize β€” ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ сообщСния.

НС сущСствуСт ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° эти значСния, хотя Π² рассматриваСмых рСализациях Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС мСста для Ρ„Π°ΠΉΠ»Π° Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ограничСния Π½Π° эти Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ памяти (см. ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.5).

Π”Ρ€ΡƒΠ³ΠΈΠ΅ Π΄Π²Π° ограничСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ:

β–  MQ_OPEN_MAX β€” максимальноС количСство ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ сообщСний, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ процСссом (Posix Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эта Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° Π±Ρ‹Π»Π° Π½Π΅ мСньшС 8);

β–  MQ_PRIO_MAX β€” максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° плюс ΠΎΠ΄ΠΈΠ½ (Posix Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эта Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° Π±Ρ‹Π»Π° Π½Π΅ мСньшС 32).

Π­Ρ‚ΠΈ Π΄Π²Π΅ константы часто ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ <unistd.h> ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Ρ‹ Π²ΠΎ врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sysconf, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π΄Π°Π»Π΅Π΅.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° mqsysconf

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π² листингС 5.7 Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sysconf ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Π΄Π²Π° ограничСния Π½Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний, опрСдСляСмыС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ.

Листинг 5.7. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ sysconf

//pxmsg/mqsysconf.с

1 #include "unpipc.h"

2 int

3 main(int argc, char **argv)

4 {

5  printf("MQ_OPEN_MAX = %ld, MQ_PRIO_MAX = %ld\n",