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

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

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

int mq_setattr(mqd_t mqdes, const struct mq_attr *attr, struct mq_attr *oattr);

/* ОбС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ 0 Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ; –1 – Π² случаС возникновСния ошибок */

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° mq_attr Ρ…Ρ€Π°Π½ΠΈΡ‚ Π² сСбС эти Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°:

struct mq_attr {

 long mq_flags;   /* Ρ„Π»Π°Π³ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ: 0, O_NONBLOCK */

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

 long mq_msgsize; /* ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ сообщСния (Π² Π±Π°ΠΉΡ‚Π°Ρ…) */

 long mq_curmsgs; // Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ количСство сообщСний Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ

}

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚Π°ΠΊΡƒΡŽ структуру ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Π² качСствС Ρ‡Π΅Ρ‚Π²Π΅Ρ€Ρ‚ΠΎΠ³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° mq_open, Ρ‡Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ mq_maxmsg ΠΈ mq_msgsize Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ создания ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Π”Ρ€ΡƒΠ³ΠΈΠ΅ Π΄Π²Π° поля структуры Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ mq_open ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ.

Ѐункция mq_getattr присваиваСт полям структуры, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ attr, Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅ значСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ.

Ѐункция mq_setattr устанавливаСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, Π½ΠΎ фактичСски ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ»Π΅ mqflags Ρ‚ΠΎΠΉ структуры, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ attr, Ρ‡Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠ±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Ρ„Π»Π°Π³ Π·Π°ΠΏΡ€Π΅Ρ‚Π° Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ. Π”Ρ€ΡƒΠ³ΠΈΠ΅ Ρ‚Ρ€ΠΈ поля структуры ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ: максимальноС количСство сообщСний Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ сообщСния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ установлСны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ создания ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, Π° количСство сообщСний Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Π½ΠΎ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ.

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ссли ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ oattr Π½Π΅Π½ΡƒΠ»Π΅Π²ΠΎΠΉ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ значСния Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ (mq_flags, mq_maxmsg, mq_msgsize) ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ статус ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ (mq_curmsgs).

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

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΠ· листинга 5.3 ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ значСния Π΅Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ².

Листинг 5.3. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний

//pxmsg/mqgetattr.c

1  #include "unpipc.h"

2  int

3  main(int argc, char **argv)

4  {

5   mqd_t mqd;

6   struct mq_attr attr;

7   if (argc != 2)

8    err_quit("usage: mqgetattr <name>");

9   mqd = Mq_open(argv[1], O_RDONLY);

10  Mq_getattr(mqd, &attr);

11  printf ("max #msgs = %ld, max #bytes/msg = %ld, "

12   "#currently on queue = %ld\n",

13   attr.mq_maxmsg, attr.mq_msgsize, attr.mq_curmsgs);

14  Mq_close(mqd);

15  exit(0);

16 }

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сообщСний ΠΈ вывСсти значСния Π΅Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², устанавливаСмыС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

solaris % mqcreate1 /hello.world

solaris % mqgetattr /hello.world

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

Вспомним Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, созданной с использованиСм устанавливаСмых ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ². Он Π±Ρ‹Π» Π²Ρ‹Π²Π΅Π΄Π΅Π½ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ ls Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ послС листинга 5.1. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ 128Γ—1024+1560 = 132632.

Π”ΠΎΠ±Π°Π²ΠΎΡ‡Π½Ρ‹Π΅ 1560 Π±Π°ΠΉΡ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой, скорСС всСго, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ: 8 Π±Π°ΠΉΡ‚ Π½Π° сообщСниС плюс Π΄ΠΎΠ±Π°Π²ΠΎΡ‡Π½Ρ‹Π΅ 536 Π±Π°ΠΉΡ‚.

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

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈΠ· листинга 5.1 Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ создании ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ максимальноС количСство сообщСний ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ сообщСния. ΠœΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²; Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΎΠ±Π° (см., Π²ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΡƒΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.1). Π’ листингС 5.4 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Π½ΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Листинг 5.4. Π£ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½Π½Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° mqcreate

//pxmsg/mqcreate.c

1  #include "unpipc.h"

2  struct mq_attr attr; /* mq_maxmsg ΠΈ mq_msgsize ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ О */

3  int

4  main(int argc, char **argv)

5  {

6   int с flags;

7   mqd_t mqd;

8   flags = O_RDWR | O_CREAT;

9   while ((c = Getopt(argc, argv, "em:z:")) != –1) {

10   switch (c) {

11   case 'e':

12    flags |= O_EXCL;

13    break;

14   case 'm':

15    attr.mq_maxmsg = atol(optarg);

16    break;

17   case 'z':

18    attr.mq_msgsize = atol(optarg);

19    break;

20   }

21  }

22  if (optind != argc – 1)

23   err_quit("usage: mqcreate [ –С ] [ –m maxmsg –z msgsize ] <name>");

24  if ((attr.mq_maxmsg != 0 && attr.mq_msgsize ==0) ||

25   (attr.mq_maxmsg == 0 && attr.mq_msgsize != 0))

26   err_quit("must specify both –m maxmsg and –z msgsize");

27  mqd = Mq_open(argv[optind], flags, FILE_MODE,

28   (attr.mq_maxmsg != 0) ? &attr : NULL);

29  Mq_close(mqd);

30  exit(0);

31 }

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°, указываСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ двоСточия (послС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² m ΠΈ z Π² Π²Ρ‹Π·ΠΎΠ²Π΅ getopt). Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ символа ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ optarg ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚.

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

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

solaris %mqcreate –z

mqcreate: option requires an argument – z

solaris %mqcreate –q

mqcreate: illegal option – q

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ошибка (Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ β€” имя ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ) обнаруТиваСтся самой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ:

solaris %mqcreate

usage: mqcreate [ –e ] [ –m maxmsg –z msgsize ] <name>

Если Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΄Π²ΡƒΡ… Π½ΠΎΠ²Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mq_open пустой ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π² качСствС послСднСго Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π°ΡˆΡƒ структуру attr.

Запустим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² систСмС Solaris 2.6, ΡƒΠΊΠ°Π·Π°Π² максимальноС количСство сообщСний 1024 ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ сообщСния 8192 Π±Π°ΠΉΡ‚:

solaris % mqcreate –e –m 1024 -z 8192 /foobar

solaris % ls –al /tmp/.*foobar

-rw-rw-rw– 1 rstevens other1 8397336 Oct 25 11:29 /tmp/.MQDfoobar

–rw-rw-rw– 1 rstevens other1       0 Oct 25 11:29 /tmp/.MQLfoobar

–rw-r--r-- 1 rstevens other1       0 Oct 25 11:29 /tmp/.MQPfoobar

Π Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π°, содСрТащСго Π΄Π°Π½Π½Ρ‹Π΅ этой ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, соотвСтствуСт ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ количСству сообщСний Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ сообщСния (1024Γ—8192 = 8388608), Π° ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ 8728 Π±Π°ΠΉΡ‚ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ 8 Π±Π°ΠΉΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ сообщСниС (8Γ—1024) плюс Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ 536 Π±Π°ΠΉΡ‚. 

ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Digital Unix 4.0B ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ:

alpha % mqcreate –m 256 -z 2048 /tmp/bigq

alpha % ls-l/tmp/bigq

-rw-r--r-- 1 rstevens system 537288 Oct 25 15:38 /tmp/bigq

Π’ этой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ соотвСтствуСт ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ количСству сообщСний ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠΌΡƒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ сообщСния (256Γ—2048 = 524288), Π° ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ 13000 Π±Π°ΠΉΡ‚ Π΄Π°ΡŽΡ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ 48 Π±Π°ΠΉΡ‚ Π΄ΠΎΠ±Π°Π²ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сообщСния (48Γ—256) ΠΈ Π΅Ρ‰Π΅ 712 Π±Π°ΠΉΡ‚.

5.4. Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ mqsend ΠΈ mqreceive

Π­Ρ‚ΠΈ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для помСщСния сообщСний Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈ получСния ΠΈΡ… ΠΎΡ‚Ρ‚ΡƒΠ΄Π°. КаТдоС сообщСниС ΠΈΠΌΠ΅Π΅Ρ‚ свой ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт собой Π±Π΅Π·Π·Π½Π°ΠΊΠΎΠ²ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅, Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰Π΅Π΅ MQ_PRIO_MAX. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ Posix Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эта Π²Π΅Π»ΠΈΡ‡ΠΈΠ½Π° Π±Ρ‹Π»Π° Π½Π΅ мСньшС 32.

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

Π’ Solaris 2.6 Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ MQ_PRIO_MAX равняСтся ΠΈΠΌΠ΅Π½Π½ΠΎ 32, Π½ΠΎ Π² Digital Unix 4.0B этот ΠΏΡ€Π΅Π΄Π΅Π» Ρ€Π°Π²Π΅Π½ ΡƒΠΆΠ΅ 256. Π’ листингС 5.7 ΠΌΡ‹ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ эти значСния.

Ѐункция mq_receive всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΡ‚Π°Ρ€Π΅ΠΉΡˆΠ΅Π΅ Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСниС с ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ, ΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ вмСстС с содСрТимым сообщСния ΠΈ Π΅Π³ΠΎ Π΄Π»ΠΈΠ½ΠΎΠΉ.

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

ДСйствиС mq_receive отличаСтся ΠΎΡ‚ дСйствия msgrcv Π² System V (Ρ€Π°Π·Π΄Π΅Π» 6.4). БообщСния System V ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΠΎΠ»Π΅ type, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ΅ ΠΏΠΎ смыслу ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Ρƒ, Π½ΠΎ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ msgrcv ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° возвращСния сообщСний: ΡΡ‚Π°Ρ€Π΅ΠΉΡˆΠ΅Π΅ сообщСниС Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, ΡΡ‚Π°Ρ€Π΅ΠΉΡˆΠ΅Π΅ сообщСниС с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ ΠΈΠ»ΠΈ ΡΡ‚Π°Ρ€Π΅ΠΉΡˆΠ΅Π΅ сообщСниС с Ρ‚ΠΈΠΏΠΎΠΌ, Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°ΡŽΡ‰ΠΈΠΌ ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ значСния.

#include <mqueue.h>

int mq_send(mqd_t mqdes, const char *ptr, size_t len, unsigned int prio);

/* Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 0 Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, –1 – Π² случаС возникновСния ошибок */

ssize_t mq_receive(mqd_t mqdes, char *ptr, size_t len, unsigned int *priop);

/* Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ количСство Π±Π°ΠΉΡ‚ΠΎΠ² Π² сообщСнии Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. –1 – Π² случаС ошибки */

ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Ρ‚Ρ€ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΎΠ±Π΅ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Ρ‚Ρ€Π΅ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ write ΠΈ read соотвСтствСнно.

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

ОбъявлСниС указатСля Π½Π° Π±ΡƒΡ„Π΅Ρ€ ΠΊΠ°ΠΊ char* каТСтся ошибкой β€” Ρ‚ΠΈΠΏ void* большС соотвСтствовал Π±Ρ‹ ΠΏΠΎ Π΄ΡƒΡ…Ρƒ ΠΏΡ€ΠΎΡ‡ΠΈΠΌ функциям Posix.1.