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

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

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

32    errno = EAGAIN;

43    goto err;

44   }

45   /* ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ освобоТдСния мСста Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ */

46   while (attr->mq_curmsgs >= attr->mq_maxmsg)

47    pthread_cond_wait(&mqhdr->mqh_wait, &mqhdr->mqh_lock);

48  }

Листинг 5.25. Ѐункция mq_send: вторая ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°

//my_pxmsg_mmap/mq_send.с

49  /* nmsghdr Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Π½ΠΎΠ²ΠΎΠ΅ сообщСниС*/

50  if ((freeindex = mqhdr->mqh_free) == 0)

51   err_dump("mymq_send: curmsgs = %ld; free = 0", attr->mq_curmsgs);

52  nmsghdr = (struct mymsg_hdr *) &mptr[freeindex];

53  nmsghdr->msg_prio = prio;

54  nmsghdr->msg_len = len;

55  memcpy(nmsghdr + 1, ptr, len); /* ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сообщСния Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ */

56  mqhdr->mqh_free = nmsghdr->msg_next; /* Π½ΠΎΠ²ΠΎΠ΅ Π½Π°Ρ‡Π°Π»ΠΎ списка пустых сообщСний */

57  /* поиск мСста Π² спискС для Π½ΠΎΠ²ΠΎΠ³ΠΎ сообщСния */

58  index = mqhdr->mqh_head;

59  pmsghdr = (struct mymsg_hdr *) &(mqhdr->mqh_head);

60  while (index != 0) {

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

62   if (prio > msghdr->msg_prio) {

63    nmsghdr->msg_next = index;

64    pmsghdr->msg_next = freeindex;

65    break;

66   }

67   index = msghdr->msg_next;

68   pmsghdr = msghdr;

69  }

70  if (index == 0) {

71   /* ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π±Ρ‹Π»Π° пуста ΠΈΠ»ΠΈ Π½ΠΎΠ²ΠΎΠ΅ письмо Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΊ ΠΊΠΎΠ½Ρ†Ρƒ списка */

72   pmsghdr->msg_next = freeindex;

73   nmsghdr->msg_next = 0;

74  }

75  /* запускаСм любой ΠΈΠ· процСссов, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² mq_receive */

76  if (attr->mq_curmsgs == 0)

77   pthread_cond_signal(&mqhdr->mqh_wait);

78  attr->mq_curmsgs++;

79  pthread_mutex_unlock(&mqhdr->mqh_lock);

80  return(0);

81 err:

82  pthread_mutex_unlock(&mqhdr->mqh lock);

83  return(-1);

84 }

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ индСкса свободного Π±Π»ΠΎΠΊΠ°

50-52 ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ количСство свободных сообщСний ΠΏΡ€ΠΈ создании ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Ρ€Π°Π²Π½ΠΎ mq_maxmsg, ситуация, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ mq_curmsgs Π±ΡƒΠ΄Π΅Ρ‚ мСньшС mq_maxmsg для пустого списка свободных сообщСний, Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚.

ΠšΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ сообщСния

53-56 Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ nmsghdr Ρ…Ρ€Π°Π½ΠΈΡ‚ адрСс области памяти, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ помСщаСтся сообщСниС. ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΈ Π΄Π»ΠΈΠ½Π° сообщСния ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² структурС msg_hdr, Π° Π·Π°Ρ‚Π΅ΠΌ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ копируСтся содСрТимоС сообщСния, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΌ процСссом.

ΠŸΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ сообщСния Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ мСсто связного списка

57-74 ΠŸΠΎΡ€ΡΠ΄ΠΎΠΊ сообщСний Π² нашСм спискС зависит ΠΎΡ‚ ΠΈΡ… ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°: ΠΎΠ½ΠΈ располоТСны Π² порядкС Π΅Π³ΠΎ убывания. ΠŸΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ сообщСния ΠΌΡ‹ провСряСм, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π»ΠΈ сообщСния с Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ; Π² этом случаС сообщСниС добавляСтся послС послСднСго ΠΈΠ· Π½ΠΈΡ…. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ упорядочСния, ΠΌΡ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ mq_receive всСгда Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ΡΡ‚Π°Ρ€Π΅ΠΉΡˆΠ΅Π΅ сообщСниС с Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ. По ΠΌΠ΅Ρ€Π΅ продвиТСния ΠΏΠΎ списку ΠΌΡ‹ сохраняСм Π² pmsghdr адрСс ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ сообщСния, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠΌΠ΅Π½Π½ΠΎ это сообщСниС Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ индСкс Π½ΠΎΠ²ΠΎΠ³ΠΎ сообщСния Π² ΠΏΠΎΠ»Π΅ msg_next.

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

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

ΠŸΡ€ΠΎΠ±ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅ любого процСсса, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ mq_receive

75-77 Если ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π±Ρ‹Π»Π° пуста Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ помСщСния Π² Π½Π΅Π΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ сообщСния, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ pthread_cond_signal, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ любой ΠΈΠ· процСссов, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΡ… сообщСния.

78 Π£Π²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ количСство сообщСний Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ mq_curmsgs.

Ѐункция mq_receive

Π’ листингС 5.27 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mq_receive, которая ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ, Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ провСряСт объСм Π±ΡƒΡ„Π΅Ρ€Π° Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅Π³ΠΎ процСсса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ достаточным для помСщСния Ρ‚ΡƒΠ΄Π° сообщСния максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹.

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

30-40 Если ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ пуста ΠΈ установлСн Ρ„Π»Π°Π³ O_NONBLOCK, возвращаСтся ошибка с ΠΊΠΎΠ΄ΠΎΠΌ EAGAIN. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС увСличиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ счСтчика mqh_nwait, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ провСряСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ mq_send (листинг 5.25) Π² случаС, Ссли ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ пуста ΠΈ Π΅ΡΡ‚ΡŒ процСссы, ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‰ΠΈΠ΅ увСдомлСния. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ сигнала ΠΏΠΎ условной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ mq_send (листинг 5.26).

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

Наша рСализация mq_receive, ΠΊΠ°ΠΊ ΠΈ рСализация mq_send, ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ с ошибкой EINTR, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΈ оТидания сигналом, ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌ Π²Ρ‹Π·Π²Π°Π²ΡˆΠΈΠΌ процСссом.

Π’ листингС 5.28 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ тСкст Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ mq_receive. ΠœΡ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π΅ΡΡ‚ΡŒ сообщСниС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΌΡƒ процСссу.

Листинг 5.27.Ѐункция mq_receive: пСрвая ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°

//my_pxmsg_mmap/mq_receive.с

1  #include "unpipc.h"

2  #include "mqueue.h"


3  ssize_t

4  mymq_receive(mymqd_t mqd, char *ptr, size_t maxlen, unsigned int *priop)

5  {

6   int n;

7   long index;

8   int8_t *mptr;

9   ssize_t len;

10  struct mymq_hdr *mqhdr;

11  struct mymq_attr *attr;

12  struct mymsg_hdr *msghdr;

13  struct mymq_info *mqinfo;

14  mqinfo = mqd;

15  if (mqinfo->mqi_magic != MQI_MAGIC) {

16   errno = EBADF;

17   return(-1);

18  }

19  mqhdr = mqinfo->mqi_hdr; /* ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ struct */

20  mptr = (int8_t *) mqhdr; /* ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π±Π°ΠΉΡ‚ */

21  attr = &mqhdr->mqh_attr;

22  if ((n = pthread_mutex_lock(&mqhdr->mqh_lock)) != 0) {

23   errno = n;

24   return(-1);

25  }

26  if (maxlen < attr->mq_msgsize) {

27   errno = EMSGSIZE;

28   goto err;

29  }

30  if (attr->mq_curmsgs = 0) { /* ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ пуста */

31   if (mqinfo->mqi_flags & O_NONBLOCK) {

32    errno = EAGAIN;

33    goto err;

34   }

35   /* ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ помСщСния сообщСния Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ */

36   mqhdr->mqh_nwait++;

37   while (attr->mq_curmsgs == 0)

38    pthread_cond_wait(&mqhdr->mqh_wait, &mqhdr->mqh_lock);

39   mqhdr->mqh_nwait--;

40  }

Листинг 5.28. Ѐункция mq_receive: вторая ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°

//my_pxmsg_mmap/mq_receive.c

41  if ((index = mqhdr->mqh_head) == 0)

42   err_dump("mymq_receive: curmsgs = %ld; head = 0", attr->mq_curmsgs);

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

44  mqhdr->mqh_head = msghdr->msg_next; /* Π½ΠΎΠ²ΠΎΠ΅ Π½Π°Ρ‡Π°Π»ΠΎ списка */

45  len = msghdr->msg_len;

46  memcpy(ptr, msghdr + 1, len); /* ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ самого сообщСния */

47  if (priop != NULL)

48   *priop = msghdr->msg_prio;

49  /* Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ считанноС сообщСниС становится ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π² спискС пустых */

50  msghdr->msg_next = mqhdr->mqr_free;

51  mqhdr->mqh_free = index;

52  /* запуск любого процСсса, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ mq_send */

53  if (attr->mq_curmsgs == attr->mq_maxmsg)

54   pthread_cond_signal(&mqhdr->mqh_wait);

55  attr->mq_curmsgs--;

56  pthread_mutex_unlock(&mqhdr->mqh_lock);

57  return(len);

58 err:

59  pthread_mutex_unlock(&mqhdr->mqh_lock);

60  return(-1);

61 }

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ сообщСния Π²Ρ‹Π·Π²Π°Π²ΡˆΠ΅ΠΌΡƒ процСссу

43-51 msghdr ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° msg_hdr ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ сообщСния Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΠΌ. ОсвободившССся сообщСниС становится ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π² спискС свободных. 

Π Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ процСсса, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π² Π²Ρ‹Π·ΠΎΠ²Π΅ mq_send

52-54 Если ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π±Ρ‹Π»Π° ΠΏΠΎΠ»Π½ΠΎΠΉ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ считывания сообщСния, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ pthread_cond_signal для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ сообщСния Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΈΠ· процСссов, Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² Π²Ρ‹Π·ΠΎΠ²Π΅ mq_send.

5.9. РСзюмС

ΠžΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний Posix просты Π² использовании: новая ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ создаСтся (ΠΈΠ»ΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ открываСтся) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ mq_open; Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ mq_close, Π° ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ mq_unlink. ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ сообщСниС Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ mq_send, Π° ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΎΡ‚Ρ‚ΡƒΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ mq_receive. Атрибуты ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ mq_getattr ΠΈ mq_setattr, Π° функция mq_notify позволяСт Π·Π°Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ процСсс Π½Π° ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ сообщСния Π² ΠΏΡƒΡΡ‚ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. КаТдоС сообщСниС Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ (нСбольшоС Ρ†Π΅Π»ΠΎΠ΅ число), ΠΈ функция mq_receive всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΡ‚Π°Ρ€Π΅ΠΉΡˆΠ΅Π΅ сообщСниС с Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ.

Π˜Π·ΡƒΡ‡Π°Ρ mq_notify, ΠΌΡ‹ познакомились с сигналами Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ стандарта Posix, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΎΡ‚ SIGMIN Π΄ΠΎ SIGMAX. ΠŸΡ€ΠΈ установкС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° для этих сигналов с Ρ„Π»Π°Π³ΠΎΠΌ SA_SIGINFO ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒΡΡ Π² порядкС ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ двумя Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ (ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°).

НаконСц, ΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ возмоТностСй ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ сообщСний Posix Π² ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ 500 строках ΠΊΠΎΠ΄Π° Π½Π° языкС Π‘, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹, Π²Π·Π°ΠΈΠΌΠ½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ условныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Posix. Π­Ρ‚Π° рСализация ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ситуации Π³ΠΎΠ½ΠΎΠΊ ΠΏΡ€ΠΈ создании Π½ΠΎΠ²ΠΎΠΉ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ; Π΅Ρ‰Π΅ Ρ€Π°Π· Π½Π°ΠΌ придСтся ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с Ρ‚Π°ΠΊΠΎΠΉ ситуациСй Π² Π³Π»Π°Π²Π΅ 10 ΠΏΡ€ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ сСмафоров Posix.