35 if (fd < 0) {
36 if (errno == EEXIST && (oflag & O_EXCL) == 0)
37 goto exists; /* ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, OK */
38 else
39 return((mymqd_t) β1);
40 }
41 created = 1;
42 /* ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΡΠ°ΠΉΠ»Π° ΠΎΠ½ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ */
43 if (attr == NULL)
44 attr = &defattr;
45 else {
46 if (attr->mq_maxmsg <β 0 || attr->mq_msgsize <= 0) {
47 errno = EINVAL;
48 goto err;
49 }
50 }
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠΏΠΈΡΠΊΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°29-32 Π€ΡΠ½ΠΊΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π²ΡΠ·Π²Π°Π½Π° Π»ΠΈΠ±ΠΎ Ρ Π΄Π²ΡΠΌΡ, Π»ΠΈΠ±ΠΎ Ρ ΡΠ΅ΡΡΡΡΠΌΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠΎΠ³ΠΎ, ΡΠΊΠ°Π·Π°Π½ Π»ΠΈ ΡΠ»Π°Π³ O_CREAT. ΠΡΠ»ΠΈ ΡΠ»Π°Π³ ΡΠΊΠ°Π·Π°Π½, ΡΡΠ΅ΡΠΈΠΉ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ mode_t, Π° ΡΡΠΎ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ ΡΠΈΠΏ, ΡΠ²Π»ΡΡΡΠΈΠΉΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ΅Π»ΡΡ ΡΠΈΠΏΠΎΠ². ΠΡΠΈ ΡΡΠΎΠΌ ΠΌΡ ΡΡΠΎΠ»ΠΊΠ½Π΅ΠΌΡΡ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π² BSD/OS, Π³Π΄Π΅ ΡΡΠΎΡ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΊΠ°ΠΊ unsigned short (16 Π±ΠΈΡ). ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅Π»ΠΎΠ΅ Π² ΡΡΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ 32 Π±ΠΈΡΠ°, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π‘ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΡΠΎΠ³ΠΎ ΡΠΈΠΏΠ° Ρ 16 Π΄ΠΎ 32 Π±ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²ΡΠ΅ ΠΊΠΎΡΠΎΡΠΊΠΈΠ΅ ΡΠ΅Π»ΡΠ΅ Π² ΡΠΏΠΈΡΠΊΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°ΡΡΡΡ Π΄ΠΎ ΠΎΠ±ΡΡΠ½ΡΡ ΡΠ΅Π»ΡΡ . ΠΠΎ Π΅ΡΠ»ΠΈ ΠΌΡ ΡΠΊΠ°ΠΆΠ΅ΠΌ mode_t ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ va_arg, ΠΎΠ½ ΠΏΡΠΎΠΏΡΡΡΠΈΡ 16 Π±ΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π² ΡΡΠ΅ΠΊΠ΅, Π΅ΡΠ»ΠΈ ΡΡΠΎΡ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ Π±ΡΠ» ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ Π΄ΠΎ 32 Π±ΠΈΡ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ , va_mode_t, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅Ρ ΡΠ΅Π»ΡΠΌ Π² BSD/OS ΠΈ ΡΠΈΠΏΠΎΠΌ mode_t Π² Π΄ΡΡΠ³ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ . ΠΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΠΌΠΎΡΡΡΡ ΡΠ΅ΡΠ°ΡΡ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠ΅ Π½ΠΈΠΆΠ΅ ΡΡΡΠΎΠΊΠΈ Π½Π°ΡΠ΅Π³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° unpipc.h (Π»ΠΈΡΡΠΈΠ½Π³ Π.1):
#ifdef __bsdi__
#define va_mode_t int
#else
#define va_mode_t mode_t
#endif
30 ΠΡ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ Π±ΠΈΡ user-execute (S_IXUSR) Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ mode ΠΏΠΎ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ Π²ΡΠΊΠΎΡΠ΅ ΡΠ°ΡΠΊΡΡΡΡ.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ33-34 Π‘ΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΡΠΊΠ°Π·Π°Π½Π½ΡΠΌ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π±ΠΈΡ user-execute.
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ Π³ΠΎΠ½ΠΎΠΊ35-40 ΠΡΠ»ΠΈ Π±Ρ ΠΏΡΠΈ ΡΠΊΠ°Π·Π°Π½ΠΈΠΈ ΡΠ»Π°Π³Π° O_CREAT ΠΌΡ ΠΏΡΠΎΡΡΠΎ ΠΎΡΠΊΡΡΠ»ΠΈ ΡΠ°ΠΉΠ», ΠΎΡΠΎΠ±ΡΠ°Π·ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π² ΠΏΠ°ΠΌΡΡΡ ΠΈ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π»ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π½ΡΠΉ ΡΠ°ΠΉΠ» (ΠΊΠ°ΠΊ Π±ΡΠ΄Π΅Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π½ΠΈΠΆΠ΅), Ρ Π½Π°Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° Π±Ρ ΡΠΈΡΡΠ°ΡΠΈΡ Π³ΠΎΠ½ΠΎΠΊ. ΠΡΠ΅ΡΠ΅Π΄Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ mq_open ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ Π²ΡΠ·ΡΠ²Π°ΡΡΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ ΡΠ»Π°Π³ O_CREAT ΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π΅ΡΠ΅ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΊΠ°ΠΊΠΈΠΌ-ΡΠΎ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ, ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΎΠ½Π° ΠΈΠ»ΠΈ Π½Π΅Ρ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈ ΠΎΡΠΊΡΡΡΠΈΠΈ ΡΠ°ΠΉΠ»Π° Π΄Π»Ρ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ Π² ΠΏΠ°ΠΌΡΡΡ ΠΌΡ Π²ΡΠ΅Π³Π΄Π° ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΡΠ»Π°Π³ O_EXCL. ΠΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ EEXIST ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ open ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ Π΄Π»Ρ mq_open ΡΠΎΠ»ΡΠΊΠΎ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ Π±ΡΠ» ΡΠΊΠ°Π·Π°Π½ ΡΠ»Π°Π³ O_EXCL. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½ΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ open ΠΎΡΠΈΠ±ΠΊΠΈ EEXIST ΠΌΡ Π΄Π΅Π»Π°Π΅ΠΌ Π²ΡΠ²ΠΎΠ΄, ΡΡΠΎ ΡΠ°ΠΉΠ» ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ, ΠΈ ΠΏΠ΅ΡΠ΅Ρ ΠΎΠ΄ΠΈΠΌ ΠΊ Π»ΠΈΡΡΠΈΠ½Π³Ρ 5.19, ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΡΠ»Π°Π³ O_CREAT Π²ΠΎΠ²ΡΠ΅ Π½Π΅ Π±ΡΠ» ΡΠΊΠ°Π·Π°Π½.
Π‘ΠΈΡΡΠ°ΡΠΈΡ Π³ΠΎΠ½ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ Π² ΠΏΠ°ΠΌΡΡΡ ΡΠ°ΠΉΠ»Π° Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΡΡΠ΅Π±ΡΠ΅Ρ Π΄Π²ΡΡ ΡΠ°Π³ΠΎΠ² ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ: ΡΠ½Π°ΡΠ°Π»Π° ΡΠ°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΎΠ·Π΄Π°Π½ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ open, Π° Π·Π°ΡΠ΅ΠΌ Π΅Π³ΠΎ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ΠΎ. ΠΡΠΎΠ±Π»Π΅ΠΌΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ, Π΅ΡΠ»ΠΈ Π΄Π²Π° ΠΏΠΎΡΠΎΠΊΠ° (ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ²) Π²ΡΠ·ΡΠ²Π°ΡΡ mq_open ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ. ΠΠ΄ΠΈΠ½ ΠΈΠ· ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠ», ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π½ΠΎ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ Π²ΡΠΎΡΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ²ΡΠΉ Π·Π°Π²Π΅ΡΡΠΈΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ°ΠΉΠ»Π°. ΠΡΠΎΡΠΎΠΉ ΠΏΠΎΡΠΎΠΊ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡ, ΡΡΠΎ ΡΠ°ΠΉΠ» ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ (Π²ΡΠ·Π²Π°Π² open Ρ ΡΠ»Π°Π³ΠΎΠΌ O_EXCL), ΠΈ ΠΏΡΠΈΡΡΡΠΏΠΈΡ ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ.
ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π±ΠΈΡ user-execute Π΄Π»Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΡΠΎΠ³ΠΎ, Π±ΡΠ» Π»ΠΈ ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ ΡΠ°ΠΉΠ» Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. ΠΡΠΎΡ Π±ΠΈΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅ΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ·Π΄Π°Π΅Ρ ΡΡΠΎΡ ΡΠ°ΠΉΠ» (ΡΠ»Π°Π³ O_EXCL ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΡΠΎΡ ΠΏΠΎΡΠΎΠΊ); ΡΡΠΎΡ ΠΏΠΎΡΠΎΠΊ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΠ°ΠΉΠ» Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, Π° Π·Π°ΡΠ΅ΠΌ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅Ρ Π±ΠΈΡ user-execute.
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½Π°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡΡΡ Π² Π»ΠΈΡΡΠΈΠ½Π³Π°Ρ 10.28 ΠΈ 10.37.
ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π°ΡΡΠΈΠ±ΡΡΠΎΠ²42-50 ΠΡΠ»ΠΈ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΏΠ΅ΡΠ΅Π΄Π°Π½ Π½ΡΠ»Π΅Π²ΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ: 128 ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΈ 1024 Π±Π°ΠΉΡΠ° Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅. ΠΡΠ»ΠΈ Π°ΡΡΠΈΠ±ΡΡΡ ΡΠΊΠ°Π·Π°Π½Ρ ΡΠ²Π½ΠΎ, ΠΌΡ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, ΡΡΠΎ mq_maxmsg ΠΈ mq_msgsize ΠΈΠΌΠ΅ΡΡ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ.
ΠΡΠΎΡΠ°Ρ ΡΠ°ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ mq_open ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 5.18. ΠΠ½Π° Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½ΠΎΠ²ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ.
ΠΠΈΡΡΠΈΠ½Π³ 5.18. ΠΡΠΎΡΠ°Ρ ΡΠ°ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ mq_open: ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½ΠΎΠ²ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ//my_pxmsg_mmap/mq_open.Ρ
51 /* Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠ°ΠΉΠ»Π° */
52 msgsize = MSGSIZE(attr->mq_msgsize);
53 filesize = sizeof(struct mymq_hdr) + (attr->mq_maxmsg *
54 (sizeof(struct mymsg_hdr) + msgsize));
55 if (lseek(fd, filesize β 1, SEEK_SET) == β1)
56 goto err;
57 if (write(fd, "", 1) == β1)
58 goto err;
59 /* ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡΡ */
60 mptr = mmap(NULL, filesize, PROT_READ | PROT_WRITE,
61 MAP_SHARED, fd, 0);
62 if (mptr == MAP_FAILED)
63 goto err;
64 /* Π²ΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ mymq_info{} Π΄Π»Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ */
65 if ((mqinfo = mallΠΎΡ (sizeof (struct mymq_info))) == NULL)
66 goto err;
67 mqinfo->mqi_hdr = mqhdr = (struct mymq_hdr *) mptr;
68 mqinfo->mqi_magic = MQI_MAGIC;
69 mqinfo->mqi_flags = nonblock;
70 /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π² Π½Π°ΡΠ°Π»Π΅ ΡΠ°ΠΉΠ»Π° */
71 /* ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠΏΠΈΡΠΊΠ° ΠΏΡΡΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ */
72 mqhdr->mqh_attr.mq_flags = 0;
73 mqhdr->mqh_attr.mq_maxmsg = attr->mq_maxmsg;
74 mqhdr->mqh_attr.mq_msgsize = attr->mq_msgsize;
75 mqhdr->mqh_attr.mq_curmsgs = 0;
76 mqhdr->mqh_nwait = 0;
77 mqhdr->mqh_pid = 0;
78 mqhdr->mqh_head = 0;
79 index = sizeof(struct mymq_hdr);
80 mqhdr->mqh_free = index;
81 for (i = 0; i < attr->mq_maxmsg β 1; i++) {
82 msghdr = (struct mymsg_hdr *) &mptr[index];
83 index += sizeof(struct mymsg_hdr) + msgsize;
84 msghdr->msg_next = index;
85 }
86 msghdr = (struct mymsg_hdr *) &mptr[index];
87 msghdr->msg_next = 0; /* ΠΊΠΎΠ½Π΅Ρ ΡΠΏΠΈΡΠΊΠ° ΠΏΡΡΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ */
88 /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ */
89 if ((i = pthread_mutexattr_init(&mattr)) != 0)
90 goto pthreaderr;
91 pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
92 i = pthread_mutex_init(&mqhdr->mqh_lock, &mattr);
93 pthread_mutexattr_destroy(&mattr); /* ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ */
94 if (i != 0)
95 goto pthreaderr:
96 if ((i = pthread_condattr_init(&cattr)) != 0)
97 goto pthreaderr;
98 pthread_condattr_setpshared(&cattr, PTHREAD_PROCESS_SHARED);
99 i = pthread_cond_init(&mqhdr->mqh_wait, &cattr);
100 pthread_condattr_destroy(&cattr); /* ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ */
101 if (i != 0)
102 goto pthreaderr;
103 /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½Π°, ΡΠ½ΠΈΠΌΠ°Π΅ΠΌ Π±ΠΈΡ user-execute */
104 if (fchmod(fd, mode) == β1)
105 goto err;
106 close(fd);
107 return((mymqd_t) mqinfo);
108 }
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠ°ΠΉΠ»Π°51-58 ΠΡΡΠΈΡΠ»ΡΠ΅ΡΡΡ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°ΡΠ΅ΠΌ ΠΎΠΊΡΡΠ³Π»ΡΠ΅ΡΡΡ Π΄ΠΎ ΠΊΡΠ°ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡ Π΄Π»ΠΈΠ½Π½ΠΎΠ³ΠΎ ΡΠ΅Π»ΠΎΠ³ΠΎ. Π’Π°ΠΊΠΆΠ΅ Π² ΡΠ°ΠΉΠ»Π΅ ΠΎΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΌΠ΅ΡΡΠΎ Π΄Π»Ρ ΡΡΡΡΠΊΡΡΡΡ mq_hdr Π² Π½Π°ΡΠ°Π»Π΅ ΡΠ°ΠΉΠ»Π° ΠΈ msghdr Π² Π½Π°ΡΠ°Π»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ (ΡΠΈΡ. 5.2). Π Π°Π·ΠΌΠ΅Ρ Π²Π½ΠΎΠ²Ρ ΡΠΎΠ·Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ lseek ΠΈ Π·Π°ΠΏΠΈΡΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°ΠΉΡΠ° ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ 0. ΠΡΠΎΡΠ΅ Π±ΡΠ»ΠΎ Π±Ρ Π²ΡΠ·Π²Π°ΡΡ ftruncate (ΡΠ°Π·Π΄Π΅Π» 13.3), Π½ΠΎ Ρ Π½Π°Ρ Π½Π΅Ρ Π³Π°ΡΠ°Π½ΡΠΈΠΉ, ΡΡΠΎ ΡΡΠΎ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ Π±Ρ Π΄Π»Ρ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠ°ΠΉΠ»Π°.
ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠ°ΠΉΠ»Π° Π² ΠΏΠ°ΠΌΡΡΡ59-63 Π€Π°ΠΉΠ» ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ Π² ΠΏΠ°ΠΌΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ mmap.
ΠΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠ°ΠΌΡΡΠΈ ΠΏΠΎΠ΄ ΡΡΡΡΠΊΡΡΡΡ mq_info64-66 ΠΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΡΠ·ΠΎΠ²Π΅ mq_open ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ mq_infΠΎ. ΠΡΠ° ΡΡΡΡΠΊΡΡΡΠ° ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ.
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΡΡΡΠΊΡΡΡΡ mq_hdr67-87 ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΡΡΡΡΠΊΡΡΡΠ° mq_hdr. ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΡΠ²ΡΠ·Π½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ (mqh_head) ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ Π½ΡΠ»Π΅ΠΌ, Π° Π²ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ ΠΊ ΡΠΏΠΈΡΠΊΡ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΡ (mqh_frΠ΅Π΅).
ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ88-102 ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Posix ΠΌΠΎΠ³ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π½Π°ΡΡ ΠΈΠΌΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΈ ΠΈΠΌΠ΅ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΡΡΠ»ΠΎΠ²Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Ρ Π°ΡΡΠΈΠ±ΡΡΠΎΠΌ PTHREAD_PROCESS_SHARED. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΌΡ ΡΠ½Π°ΡΠ°Π»Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π°ΡΡΠΈΠ±ΡΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ pthread_mutexattr_init, Π° Π·Π°ΡΠ΅ΠΌ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠ° ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠ³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌΠΈ, Π²ΡΠ·Π²Π°Π² pthread_mutexattr_setpshared. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ pthread_mutex_init. ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π΄Π»Ρ ΡΡΠ»ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ. ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π°ΠΊΠΊΡΡΠ°ΡΠ½ΠΎ ΡΠ΄Π°Π»ΠΈΡΡ Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΡΡΠ»ΠΎΠ²Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π΄Π°ΠΆΠ΅ ΠΏΡΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π²ΡΠ·ΠΎΠ²Ρ pthread_ mutexattr_init ΠΈ pthread_condattr_init Π²ΡΠ΄Π΅Π»ΡΡΡ ΠΏΠΎΠ΄ Π½ΠΈΡ ΠΏΠ°ΠΌΡΡΡ (ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 7.3).
Π‘Π±ΡΠΎΡ Π±ΠΈΡΠ° user-execute103-107 ΠΠΎΡΠ»Π΅ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΌΡ ΡΠ±ΡΠ°ΡΡΠ²Π°Π΅ΠΌ Π±ΠΈΡ user-execute. ΠΡΠΎ Π³ΠΎΠ²ΠΎΡΠΈΡ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ°ΠΌ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π±ΡΠ»Π° ΠΏΡΠΎΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π°. ΠΡ ΡΠ°ΠΊΠΆΠ΅ Π·Π°ΠΊΡΡΠ²Π°Π΅ΠΌ ΡΠ°ΠΉΠ» Π²ΡΠ·ΠΎΠ²ΠΎΠΌ close, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½ Π±ΡΠ» ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ Π² ΠΏΠ°ΠΌΡΡΡ ΠΈ Π΄Π΅ΡΠΆΠ°ΡΡ Π΅Π³ΠΎ ΠΎΡΠΊΡΡΡΡΠΌ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ.