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.