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

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

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

35   if (fd < 0) {

36    if (errno == EEXIST && (oflag & O_EXCL) == 0)

37     goto exists; /* ΡƒΠΆΠ΅ сущСствуСт, OK */

38    else

39     return((mymqd_t) –1);

40   }

41   created = 1;

42   /* ΠΏΡ€ΠΈ создании Ρ„Π°ΠΉΠ»Π° ΠΎΠ½ инициализируСтся */

43   if (attr == NULL)

44    attr = &defattr;

45   else {

46    if (attr->mq_maxmsg <– 0 || attr->mq_msgsize <= 0) {

47     errno = EINVAL;

48     goto err;

49    }

50   }

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° списка Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°

29-32 Ѐункция ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° Π»ΠΈΠ±ΠΎ с двумя, Π»ΠΈΠ±ΠΎ с Ρ‡Π΅Ρ‚Ρ‹Ρ€ΡŒΠΌΡ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΡƒΠΊΠ°Π·Π°Π½ Π»ΠΈ Ρ„Π»Π°Π³ O_CREAT. Если Ρ„Π»Π°Π³ ΡƒΠΊΠ°Π·Π°Π½, Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ mode_t, Π° это простой систСмный Ρ‚ΠΈΠΏ, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Ρ†Π΅Π»Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ². ΠŸΡ€ΠΈ этом ΠΌΡ‹ столкнСмся с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π² BSD/OS, Π³Π΄Π΅ этот Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊ unsigned short (16 Π±ΠΈΡ‚). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ†Π΅Π»ΠΎΠ΅ Π² этой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ 32 Π±ΠΈΡ‚Π°, компилятор Π‘ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ этого Ρ‚ΠΈΠΏΠ° с 16 Π΄ΠΎ 32 Π±ΠΈΡ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ всС ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΈΠ΅ Ρ†Π΅Π»Ρ‹Π΅ Π² спискС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π΄ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Ρ†Π΅Π»Ρ‹Ρ…. Но Ссли ΠΌΡ‹ ΡƒΠΊΠ°ΠΆΠ΅ΠΌ mode_t ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ va_arg, ΠΎΠ½ пропустит 16 Π±ΠΈΡ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π² стСкС, Ссли этот Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π±Ρ‹Π» ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ Π΄ΠΎ 32 Π±ΠΈΡ‚. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ свой собствСнный Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, va_mode_t, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ†Π΅Π»Ρ‹ΠΌ Π² BSD/OS ΠΈ Ρ‚ΠΈΠΏΠΎΠΌ mode_t Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… систСмах. Π­Ρ‚Ρƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΠΌΠΎΡΡ‚ΡŒΡŽ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π½ΠΈΠΆΠ΅ строки нашСго Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° unpipc.h (листинг Π’.1):

#ifdef __bsdi__

#define va_mode_t int

#else

#define va_mode_t mode_t

#endif

30 ΠœΡ‹ сбрасываСм Π±ΠΈΡ‚ user-execute (S_IXUSR) Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ mode ΠΏΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ вскорС раскрыты.

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний

33-34 БоздаСтся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΈ устанавливаСтся Π±ΠΈΡ‚ user-execute. 

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ситуации Π³ΠΎΠ½ΠΎΠΊ

35-40 Если Π±Ρ‹ ΠΏΡ€ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ Ρ„Π»Π°Π³Π° O_CREAT ΠΌΡ‹ просто ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΈ Ρ„Π°ΠΉΠ», ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΠ»ΠΈ Π΅Π³ΠΎ содСрТимоС Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» (ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ описано Π½ΠΈΠΆΠ΅), Ρƒ нас Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° Π±Ρ‹ ситуация Π³ΠΎΠ½ΠΎΠΊ. ΠžΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний инициализируСтся mq_open Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ процСсс ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„Π»Π°Π³ O_CREAT ΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний Π΅Ρ‰Π΅ Π½Π΅ сущСствуСт. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, сущСствуСт ΠΎΠ½Π° ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Для этого ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ отобраТСния Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΌΡ‹ всСгда ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„Π»Π°Π³ O_EXCL. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ошибки EEXIST Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ open являСтся ошибкой для mq_open Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Π±Ρ‹Π» ΡƒΠΊΠ°Π·Π°Π½ Ρ„Π»Π°Π³ O_EXCL. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ open ошибки EEXIST ΠΌΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» ΡƒΠΆΠ΅ сущСствуСт, ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ листингу 5.19, ΠΊΠ°ΠΊ Ссли Π±Ρ‹ Ρ„Π»Π°Π³ O_CREAT вовсС Π½Π΅ Π±Ρ‹Π» ΡƒΠΊΠ°Π·Π°Π½.

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

ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π±ΠΈΡ‚ user-execute для указания Ρ‚ΠΎΠ³ΠΎ, Π±Ρ‹Π» Π»ΠΈ ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ Ρ„Π°ΠΉΠ» с ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ сообщСний. Π­Ρ‚ΠΎΡ‚ Π±ΠΈΡ‚ устанавливаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ создаСт этот Ρ„Π°ΠΉΠ» (Ρ„Π»Π°Π³ O_EXCL позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ этот ΠΏΠΎΡ‚ΠΎΠΊ); этот ΠΏΠΎΡ‚ΠΎΠΊ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„Π°ΠΉΠ» с ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒΡŽ сообщСний, Π° Π·Π°Ρ‚Π΅ΠΌ сбрасываСт Π±ΠΈΡ‚ user-execute.

Аналогичная ситуация ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π² листингах 10.28 ΠΈ 10.37.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ²

42-50 Если ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Π² качСствС послСднСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Π½ΡƒΠ»Π΅Π²ΠΎΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний инициализируСтся со значСниями Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: 128 сообщСний Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ 1024 Π±Π°ΠΉΡ‚Π° Π½Π° сообщСниС. Если Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ явно, ΠΌΡ‹ провСряСм, Ρ‡Ρ‚ΠΎ mq_maxmsg ΠΈ mq_msgsize ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния.

Вторая Ρ‡Π°ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mq_open ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² листингС 5.18. Она Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ Π½ΠΎΠ²ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний.

Листинг 5.18. Вторая Ρ‡Π°ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mq_open: инициализация Π½ΠΎΠ²ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ

//my_pxmsg_mmap/mq_open.с

51    /* вычислСниС ΠΈ установка Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ„Π°ΠΉΠ»Π° */

52    msgsize = MSGSIZE(attr->mq_msgsize);

53    filesize = sizeof(struct mymq_hdr) + (attr->mq_maxmsg *

54     (sizeof(struct mymsg_hdr) + msgsize));

55    if (lseek(fd, filesize – 1, SEEK_SET) == –1)

56     goto err;

57    if (write(fd, "", 1) == –1)

58     goto err;

59    /* ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ */

60    mptr = mmap(NULL, filesize, PROT_READ | PROT_WRITE,

61     MAP_SHARED, fd, 0);

62    if (mptr == MAP_FAILED)

63     goto err;

64    /* Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ структуры mymq_info{} для ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ */

65    if ((mqinfo = mallос (sizeof (struct mymq_info))) == NULL)

66     goto err;

67    mqinfo->mqi_hdr = mqhdr = (struct mymq_hdr *) mptr;

68    mqinfo->mqi_magic = MQI_MAGIC;

69    mqinfo->mqi_flags = nonblock;

70    /* инициализация Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ„Π°ΠΉΠ»Π° */

71    /* созданиС списка пустых сообщСний */

72    mqhdr->mqh_attr.mq_flags = 0;

73    mqhdr->mqh_attr.mq_maxmsg = attr->mq_maxmsg;

74    mqhdr->mqh_attr.mq_msgsize = attr->mq_msgsize;

75    mqhdr->mqh_attr.mq_curmsgs = 0;

76    mqhdr->mqh_nwait = 0;

77    mqhdr->mqh_pid = 0;

78    mqhdr->mqh_head = 0;

79    index = sizeof(struct mymq_hdr);

80    mqhdr->mqh_free = index;

81    for (i = 0; i < attr->mq_maxmsg – 1; i++) {

82     msghdr = (struct mymsg_hdr *) &mptr[index];

83     index += sizeof(struct mymsg_hdr) + msgsize;

84     msghdr->msg_next = index;

85    }

86    msghdr = (struct mymsg_hdr *) &mptr[index];

87    msghdr->msg_next = 0; /* ΠΊΠΎΠ½Π΅Ρ† списка пустых сообщСний */

88    /* инициализация Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ */

89    if ((i = pthread_mutexattr_init(&mattr)) != 0)

90     goto pthreaderr;

91    pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);

92    i = pthread_mutex_init(&mqhdr->mqh_lock, &mattr);

93    pthread_mutexattr_destroy(&mattr); /* ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ */

94    if (i != 0)

95     goto pthreaderr:

96    if ((i = pthread_condattr_init(&cattr)) != 0)

97     goto pthreaderr;

98    pthread_condattr_setpshared(&cattr, PTHREAD_PROCESS_SHARED);

99    i = pthread_cond_init(&mqhdr->mqh_wait, &cattr);

100   pthread_condattr_destroy(&cattr); /* ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ */

101   if (i != 0)

102    goto pthreaderr;

103   /* инициализация Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°, снимаСм Π±ΠΈΡ‚ user-execute */

104   if (fchmod(fd, mode) == –1)

105    goto err;

106   close(fd);

107   return((mymqd_t) mqinfo);

108  }

Установка Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ„Π°ΠΉΠ»Π°

51-58 ВычисляСтся Ρ€Π°Π·ΠΌΠ΅Ρ€ сообщСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π·Π°Ρ‚Π΅ΠΌ округляСтся Π΄ΠΎ ΠΊΡ€Π°Ρ‚Π½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ Π΄Π»ΠΈΠ½Π½ΠΎΠ³ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ. Π’Π°ΠΊΠΆΠ΅ Π² Ρ„Π°ΠΉΠ»Π΅ отводится мСсто для структуры mq_hdr Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ„Π°ΠΉΠ»Π° ΠΈ msghdr Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сообщСния (рис. 5.2). Π Π°Π·ΠΌΠ΅Ρ€ вновь созданного Ρ„Π°ΠΉΠ»Π° устанавливаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ lseek ΠΈ записью ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0. ΠŸΡ€ΠΎΡ‰Π΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ftruncate (Ρ€Π°Π·Π΄Π΅Π» 13.3), Π½ΠΎ Ρƒ нас Π½Π΅Ρ‚ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΉ, Ρ‡Ρ‚ΠΎ это сработало Π±Ρ‹ для увСличСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ„Π°ΠΉΠ»Π°.

ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ

59-63 Π€Π°ΠΉΠ» отобраТаСтся Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ mmap.

Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ памяти ΠΏΠΎΠ΄ структуру mq_info

64-66 ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ mq_open создаСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр mq_infΠΎ. Π­Ρ‚Π° структура послС создания инициализируСтся.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ структуры mq_hdr

67-87 Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ΡΡ структура mq_hdr. Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ связного списка сообщСний (mqh_head) инициализируСтся Π½ΡƒΠ»Π΅ΠΌ, Π° всС сообщСния Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΊ списку свободных (mqh_frΠ΅Π΅).

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ

88-102 ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний Posix ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ совмСстно ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ количСством процСссов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π½Π°ΡŽΡ‚ имя ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ PTHREAD_PROCESS_SHARED. Для этого ΠΌΡ‹ сначала ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ pthread_mutexattr_init, Π° Π·Π°Ρ‚Π΅ΠΌ устанавливаСм Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° совмСстного использования процСссами, Π²Ρ‹Π·Π²Π°Π² pthread_mutexattr_setpshared. ПослС этого Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ инициализируСтся Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ pthread_mutex_init. АналогичныС дСйствия Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ для условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΡƒΡΠ»ΠΎΠ²Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π΄Π°ΠΆΠ΅ ΠΏΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибки, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ pthread_ mutexattr_init ΠΈ pthread_condattr_init Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ ΠΏΠΎΠ΄ Π½ΠΈΡ… ΠΏΠ°ΠΌΡΡ‚ΡŒ (ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.3).

Бброс Π±ΠΈΡ‚Π° user-execute

103-107 ПослС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний ΠΌΡ‹ сбрасываСм Π±ΠΈΡ‚ user-execute. Π­Ρ‚ΠΎ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠΌ процСссам ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π±Ρ‹Π»Π° ΠΏΡ€ΠΎΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π°. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ close, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π±Ρ‹Π» ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΈ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ большС Π½Π΅Ρ‚ нСобходимости.