24 mqstat->mq_curmsgs = attr->mq_curmsgs;
25 pthread_mutex_unlock(&mqhdr->mqh_lock);
26 return(0);
27 }
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ17-20 ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΡ, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ Π² ΡΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ.
Π€ΡΠ½ΠΊΡΠΈΡ mq_setattr
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 5.23 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ mq_setattr, ΠΊΠΎΡΠΎΡΠ°Ρ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ.
Π‘ΡΠΈΡΡΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠΈΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ²22-27 ΠΡΠ»ΠΈ ΡΡΠ΅ΡΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ΠΏΠ΅ΡΠ΅Π΄ Π²Π½Π΅ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ.
ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ mq_flags28-31 ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ Π°ΡΡΠΈΠ±ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π½Π°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, β mq_flags, Ρ ΡΠ°Π½ΡΡΠΈΠΉΡΡ Π² ΡΡΡΡΠΊΡΡΡΠ΅ mq_infΠΎ.
ΠΠΈΡΡΠΈΠ½Π³ 5.23. Π€ΡΠ½ΠΊΡΠΈΡ mq_setattr//my_pxmsg_mniap/mq_setattr.Ρ
1 #include "unpipc.h"
2 #include "mqueue.h"
3 int
4 mymq_setattr(mymqd_t mqd. const struct mymq_attr *mqstat,
5 struct mymq attr *omqstat)
6 {
7 int n;
8 struct mymq_hdr *mqhdr;
9 struct mymq_attr *attr;
10 struct mymq_info *mqinfo;
11 mqinfo = mqd;
12 if (mqinfo->mqi_magic != MQI_MAGIC) {
13 errno = EBADF;
14 return(-1);
15 }
16 mqhdr = mqinfo->mqi_hdr;
17 attr = &mqhdr->mqh_attr;
18 if ((n = pthread_mutex_lock(&mqhdr->mqh_lock)) ! = 0) {
19 errno = n;
20 return(-1);
21 }
22 if (omqstat != NULL) {
23 omqstat->mq_flags = mqinfo->mqi_flags; /* ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ Π°ΡΡΠΈΠ±ΡΡΡ */
24 omqstat->mq_maxmsg = attr->mq_maxmsg;
25 omqstat->mq_msgsize = attr->mq_msgsize;
26 omqstat->mq_curmsgs = attr->mq_curmsgs; /* ΡΠ΅ΠΊΡΡΠΈΠΉ ΡΡΠ°ΡΡΡ */
27 }
28 if (mqstat->mq_flags & O_NONBLOCK)
29 mqinfo->mqi flags |= O_NONBLOCK;
30 else
31 mqinfo->ntqi_flags &= ~O_NONBLOCK;
32 pthread_mutex_unlock(&mqhdr->mqh_lock);
33 return(0);
34 }
Π€ΡΠ½ΠΊΡΠΈΡ mq_notify
Π€ΡΠ½ΠΊΡΠΈΡ mq_notify, ΡΠ΅ΠΊΡΡ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 5.24, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΈ ΡΠ½ΠΈΠΌΠ°ΡΡ Π΅Π³ΠΎ Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ. ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°Ρ (ΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ) Ρ ΡΠ°Π½ΠΈΡΡΡ Π² ΠΏΠΎΠ»Π΅ mqh_pid ΡΡΡΡΠΊΡΡΡΡ mq_hdr. Π’ΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡΠ΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ Π½Π° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΡΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΌΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ Π΅Π³ΠΎ ΡΡΡΡΠΊΡΡΡΡ sigevent Π² ΡΡΡΡΠΊΡΡΡΠ΅ mqh_event.
ΠΠΈΡΡΠΈΠ½Π³ 5.24. Π€ΡΠ½ΠΊΡΠΈΡ mq_notify//my_pxmsg_mmap/mq_notify.Ρ
1 #include "unpipc.h"
2 #include "mqueue.h"
3 int
4 mymq_notify(mymqd_t mqd, const struct sigevent *notification)
5 {
6 int n;
7 pid_t pid;
8 struct mymq_hdr *mqhdr;
9 struct mymq_info *mqinfo;
10 mqinfo = mqd;
11 if (mqinfo->mqi magic != MQI_MAGIC) {
12 errno = EBADF;
13 return(-1);
14 }
15 mqhdr = mqinfo->mqi_hdr;
16 if ((n = pthread_mutex_lock(&mqhdr->mqh_lock)) != 0) {
17 errno = n;
18 return(-1);
19 }
20 pid = getpid();
21 if (notification == NULL) {
22 if (mqhdr->mqh_pid == pid) {
23 mqhdr->mqh_pid = 0; /* ΡΠ½ΡΡΠΈΠ΅ Π²ΡΠ·Π²Π°Π²ΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ */
24 } /* Π΅ΡΠ»ΠΈ Π²ΡΠ·Π²Π°Π²ΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π΅ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ β 61Π */
25 } else {
26 if (mqhdr->mqh_pid != 0) {
27 if (kill(mqhdr->mqh_pid, 0) != β1 || errno != ESRCH) {
28 errno = EBUSY;
29 goto err;
30 }
31 }
32 mqhdr->mqh_pid = pid;
33 mqhdr->mqh_event = *notification;
34 }
35 pthread_mutex_unlock(&mqhdr->mqh_lock);
36 return(0);
37 err:
38 pthread_mutex_unlock(&mqhdr->mqh_lock);
39 return(-1);
40 }
Π‘Π½ΡΡΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠ° Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ20-24 ΠΡΠ»ΠΈ Π²ΡΠΎΡΠΎΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ Π½ΡΠ»Π΅Π²ΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, Π²ΡΠ·Π²Π°Π²ΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ½ΠΈΠΌΠ°Π΅ΡΡΡ Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ. ΠΡΠ»ΠΈ ΠΎΠ½ Π½Π΅ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½, Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ.
Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ Π²ΡΠ·Π²Π°Π²ΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ°25-34 ΠΡΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΆΠ΅ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½, ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π»ΠΈ ΠΎΠ½, ΠΎΡΠΏΡΠ°Π²ΠΊΠΎΠΉ Π΅ΠΌΡ ΡΠΈΠ³Π½Π°Π»Π° Ρ ΠΊΠΎΠ΄ΠΎΠΌ 0 (Π½Π°Π·ΡΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ Π½ΡΠ»Π΅Π²ΡΠΌ ΡΠΈΠ³Π½Π°Π»ΠΎΠΌ β null signal). ΠΡΠΎ ΠΎΠ±ΡΡΠ½Π°Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ, Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΠΏΡΠΈ ΡΡΠΎΠΌ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π° ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ, Π½ΠΎ ΠΏΡΠΈ Π΅Π³ΠΎ ΠΎΡΡΡΡΡΡΠ²ΠΈΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ° Ρ ΠΊΠΎΠ΄ΠΎΠΌ ESRCH. ΠΡΠ»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΆΠ΅ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ Π½Π° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅, ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ EBUSY. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π²ΠΌΠ΅ΡΡΠ΅ Ρ Π΅Π³ΠΎ ΡΡΡΡΠΊΡΡΡΠΎΠΉ sigevent.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
ΠΠ°Ρ ΠΌΠ΅ΡΠΎΠ΄ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ·Π²Π°Π²ΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° Π½Π΅ ΠΈΠ΄Π΅Π°Π»Π΅Π½. ΠΡΠΎΡΠ΅ΡΡ ΠΌΠΎΠ³ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ, Π° Π΅Π³ΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΌΠΎΠ³ Π±ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ.
Π€ΡΠ½ΠΊΡΠΈΡ mq_send
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 5.25 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρ Π½Π°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ mqsend.
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ14-29 ΠΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΡΡΡΡΠΊΡΡΡΡ ΠΈ Π±Π»ΠΎΠΊΠΈΡΡΠ΅ΠΌ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ. ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, Π½Π΅ ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ Π»ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΉ Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ.
ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π½Π° ΠΏΡΡΡΠΎΡΡ ΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ30-38 ΠΡΠ»ΠΈ ΠΌΡ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² ΠΏΡΡΡΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ, Π½ΡΠΆΠ½ΠΎ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ, Π½Π΅ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½ Π»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡΠ΄Ρ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π° ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎΠ± ΡΡΠΎΠΌ ΡΠΎΠ±ΡΡΠΈΠΈ ΠΈ Π½Π΅Ρ Π»ΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ², Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π² Π²ΡΠ·ΠΎΠ²Π΅ mq_receive. ΠΠ»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΡΠΎΡΠΎΠ³ΠΎ ΡΡΠ»ΠΎΠ²ΠΈΡ ΠΌΡ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌΡΠΌ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ mq_receive ΡΡΠ΅ΡΡΠΈΠΊΠΎΠΌ mqh_nwait, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ², Π·Π°Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Π² Π²ΡΠ·ΠΎΠ²Π΅ mq_receive. ΠΡΠ»ΠΈ ΡΡΠΎΡ ΡΡΠ΅ΡΡΠΈΠΊ ΠΈΠΌΠ΅Π΅Ρ Π½Π΅Π½ΡΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, ΠΌΡ Π½Π΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ Π·Π°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΡ. ΠΠ»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΈΠ³Π½Π°Π»Π° SIGEV_SIGNAL ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡ sigqueue. ΠΠ°ΡΠ΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ½ΠΈΠΌΠ°Π΅ΡΡΡ Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
ΠΡΠ·ΠΎΠ² sigqueue Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΈΠ³Π½Π°Π»Π° ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΡ ΠΊ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΡΠΈΠ³Π½Π°Π»Π° SI_QUEUE ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΡ ΡΠΈΠ³Π½Π°Π»Π° Π² ΡΡΡΡΠΊΡΡΡΠ΅ ΡΠΈΠΏΠ° siginfo_t (ΡΠ°Π·Π΄Π΅Π» 5.7), ΡΡΠΎ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ. ΠΡΠΏΡΠ°Π²ΠΊΠ° ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ si_code (Π° ΠΈΠΌΠ΅Π½Π½ΠΎ SI_MESGQ) ΠΈΠ· ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΠ° Ρ. 433 ΡΡΠ°Π½Π΄Π°ΡΡΠ° IEEE 1996 [8] ΠΎΡΠΌΠ΅ΡΠ°Π΅ΡΡΡ, ΡΡΠΎ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΡΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π° ΠΈΠ· ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠΊΡΡΡΡΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΈΠ³Π½Π°Π»ΠΎΠ².
ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΡΡΠΈ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ39-48 ΠΡΠ»ΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½Π° ΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΡΠ»Π°Π³ O_NONBLOCK, ΠΌΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΎΡΠΈΠ±ΠΊΡ Ρ ΠΊΠΎΠ΄ΠΎΠΌ EAGAIN. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌ ΡΠΈΠ³Π½Π°Π»Π° ΠΏΠΎ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ mqh_wait, ΠΊΠΎΡΠΎΡΡΠΉ, ΠΊΠ°ΠΊ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ, ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ mq_receive ΠΏΡΠΈ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΠΏΠΎΠ»Π½Π΅Π½Π½ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
ΠΠ°ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΏΡΠΎΡΠ°Π΅Ρ ΡΠΈΡΡΠ°ΡΠΈΡ Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΡΠΈΠ±ΠΊΠΈ EINTR ΠΏΡΠΈ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΠΈ Π²ΡΠ·ΠΎΠ²Π° mq_send ΡΠΈΠ³Π½Π°Π»ΠΎΠΌ, ΠΏΠ΅ΡΠ΅Ρ Π²Π°ΡΡΠ²Π°Π΅ΠΌΡΠΌ Π²ΡΠ·Π²Π°Π²ΡΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡΠΎΠΌ, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ pthread_cond_wait Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΏΡΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅ ΠΈΠ· ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° ΡΠΈΠ³Π½Π°Π»Π°: ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ Π²Π΅ΡΠ½ΡΡΡ Π»ΠΈΠ±ΠΎ 0 (ΡΡΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ Π»ΠΎΠΆΠ½ΠΎΠ΅ ΠΏΡΠΎΠ±ΡΠΆΠ΄Π΅Π½ΠΈΠ΅), Π»ΠΈΠ±ΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ Π·Π°Π²Π΅ΡΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ. ΠΡΠ΅ ΡΡΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡΠΈ, Π½ΠΎ ΡΡΠΎ Π½Π΅ΠΏΡΠΎΡΡΠΎ.
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 5.26 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π²ΡΠΎΡΠ°Ρ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° ΡΡΠ½ΠΊΡΠΈΠΈ mq_send. Π ΠΌΠΎΠΌΠ΅Π½ΡΡ Π΅Π΅ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΌΡ ΡΠΆΠ΅ Π·Π½Π°Π΅ΠΌ ΠΎ Π½Π°Π»ΠΈΡΠΈΠΈ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΡΠ° Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ.
ΠΠΈΡΡΠΈΠ½Π³ 5.25. Π€ΡΠ½ΠΊΡΠΈΡ mq_send: ΠΏΠ΅ΡΠ²Π°Ρ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°//my_pxmsg_mmap/mq_send.Ρ
1 #include "unpipc.h"
2 #include "mqueue.h"
3 int
4 mymq_send(mymqd_t mqd, const char *ptr, size_t len, unsigned int prio)
5 {
6 int n;
7 long index, freeindex;
8 int8_t *mptr;
9 struct sigevent *sigev;
10 struct mymq_hdr *mqhdr;
11 struct mymq_attr *attr;
12 struct mymsg_hdr *msghdr, *nmsghdr, *pmsghdr;
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 (len > attr->mq_msgsize) {
27 errno = EMSGSIZE;
28 goto err;
29 }
30 if (attr->mq_curmsgs == 0) {
31 if (mqhdr->mqh_pid != 0 && mqhdr->mqh_nwait == 0) {
32 sigev = &mqhdr->mqh_event;
33 if (sigev->sigev_notify == SIGEV_SIGNAL) {
34 sigqueue(mqhdr->mqh_pid, sigev->sigev_signo,
35 sigev->sigev_value);
36 }
37 mqhdr->mqh_pid = 0; /* ΡΠ½ΡΡΠΈΠ΅ Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ */
38 }
39 } else if (attr->mq_curmsgs >= attr->mq_maxmsg) {
40 /* 4queue is full */
41 if (mqinfo->mqi_flags & O_NONBLOCK) {
32 errno = EAGAIN;