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_receive75-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_send52-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.