ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° len ΡΡΠ½ΠΊΡΠΈΠΈ mq_receive Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅ Π½Π΅ ΠΌΠ΅Π½ΡΡΠ΅ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΎ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ, ΡΠΎ Π΅ΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»Ρ mq_msgsize ΡΡΡΡΠΊΡΡΡΡ mq_attr Π΄Π»Ρ ΡΡΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ. ΠΡΠ»ΠΈ len ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ ΠΌΠ΅Π½ΡΡΠ΅ ΡΡΠΎΠΉ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ, Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΎΡΠΈΠ±ΠΊΠ° EMSGSIZE.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Posix, ΠΏΡΠΈΠ΄Π΅ΡΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡ mq_getattr ΠΏΠΎΡΠ»Π΅ ΠΎΡΠΊΡΡΡΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, Π° Π·Π°ΡΠ΅ΠΌ Π²ΡΠ΄Π΅Π»ΡΡΡ ΠΏΠ°ΠΌΡΡΡ ΠΏΠΎΠ΄ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±ΡΡΠ΅ΡΠΎΠ² ΡΡΠ΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°. Π’ΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅, ΡΡΠΎΠ±Ρ Π±ΡΡΠ΅Ρ Π±ΡΠ» Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡ, ΡΠ΅ΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ mq_receive Π½Π΅ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΠΈΡΡΠΌΠ° ΠΏΡΠ΅Π²ΡΡΠ°Π΅Ρ ΠΎΠ±ΡΠ΅ΠΌ Π±ΡΡΠ΅ΡΠ°. Π‘ΡΠ°Π²Π½ΠΈΡΠ΅ ΡΡΠΎ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Ρ ΡΠ»Π°Π³ΠΎΠΌ MSG_NOERROR ΠΈ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ E2BIG Π΄Π»Ρ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ System V (ΡΠ°Π·Π΄Π΅Π» 6.4) ΠΈ ΡΠ»Π°Π³ΠΎΠΌ MSG_TRUNC Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ recvmsg, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ Ρ Π΄Π΅ΠΉΡΠ°Π³ΡΠ°ΠΌΠΌΠ°ΠΌΠΈ UDP (ΡΠ°Π·Π΄Π΅Π» 13.5 [24]).
ΠΡΠ³ΡΠΌΠ΅Π½Ρ prio ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ mq_send, Π΅Π³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΌΠ΅Π½ΡΡΠ΅ MQ_PRIO_MAX. ΠΡΠ»ΠΈ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ mq_receive priop ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅Π½ΡΠ»Π΅Π²ΡΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ, Π² Π½Π΅ΠΌ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΡΠ»ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠ² ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π΅Π³ΠΎ ΡΠ°Π²Π½ΡΠΌ Π½ΡΠ»Ρ Π΄Π»Ρ mq_send ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ mq_receive Π½ΡΠ»Π΅Π²ΠΎΠΉ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
Π Π°Π·ΡΠ΅ΡΠ΅Π½Π° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π½ΡΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ. ΠΡΠΎ ΡΠΎΡ ΡΠ»ΡΡΠ°ΠΉ, ΠΊΠΎΠ³Π΄Π° Π²Π°ΠΆΠ½ΠΎ Π½Π΅ ΡΠΎ, ΠΎ ΡΠ΅ΠΌ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ΅ (Posix.1), Π° ΡΠΎ, ΠΎ ΡΠ΅ΠΌ Π² Π½Π΅ΠΌ Π½Π΅ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ: Π½ΠΈΠ³Π΄Π΅ Π½Π΅ Π·Π°ΠΏΡΠ΅ΡΠ΅Π½Π° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π½ΡΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ. Π€ΡΠ½ΠΊΡΠΈΡ mq_receive Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π±Π°ΠΉΡΠΎΠ² Π² ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΈ (Π² ΡΠ»ΡΡΠ°Π΅ ΡΡΠΏΠ΅ΡΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ) ΠΈΠ»ΠΈ β1 Π² ΡΠ»ΡΡΠ°Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ, ΡΠ°ΠΊ ΡΡΠΎ 0 ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½ΡΠ»Π΅Π²ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ.
ΠΡΠ΅ΡΠ΅Π΄ΡΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Posix ΠΈ System V Π½Π΅ Ρ Π²Π°ΡΠ°Π΅Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ: ΠΏΠΎΠ»ΡΡΠ°ΡΠ΅Π»Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ. ΠΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΌΠΎΠ³Π»Π° Π±Ρ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡΡ ΠΌΠ½ΠΎΠ³ΠΈΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠ² ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ IPC Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. Π ΡΠ°Π·Π΄Π΅Π»Π΅ 15.5 ΠΌΡ ΡΠ°ΡΡΠΊΠ°ΠΆΠ΅ΠΌ, ΠΊΠ°ΠΊ ΡΡΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ Π΄Π»Ρ Π΄Π²Π΅ΡΠ΅ΠΉ. Π ΡΠ°Π·Π΄Π΅Π»Π΅ 14.8 [24] ΠΎΠΏΠΈΡΠ°Π½ΠΎ, ΠΊΠ°ΠΊ ΡΡΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅ΡΡΡ Π² BSD/OS Π΄Π»Ρ Π΄ΠΎΠΌΠ΅Π½Π½ΡΡ ΡΠΎΠΊΠ΅ΡΠΎΠ² Unix. Π ΡΠ°Π·Π΄Π΅Π»Π΅ 15.3.1 [21] ΠΎΠΏΠΈΡΠ°Π½ΠΎ, ΠΊΠ°ΠΊ SVR4 ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠ± ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Π΅ ΠΏΠΎ ΠΊΠ°Π½Π°Π»Ρ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ ΠΏΠΎ Π½Π΅ΠΌΡ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ°. Π Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΠΌΠ΅ΡΠΎΠ΄Ρ BSD/OS ΡΠΈΡΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ, ΠΈ Ρ ΠΎΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ SVR4 ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ° Unix 98, ΠΎΠ½Π° ΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡΠ° ΠΏΠΎ ΠΊΠ°Π½Π°Π»Ρ, ΡΡΠΎ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ Π΄ΠΎΡΠΎΠ³ΠΎΡΡΠΎΡΡΠ΅ΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ΅ΠΉ, ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° Π΄Π°Π½Π½ΡΡ . ΠΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΠ΅Π±Π΅ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΉ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ) Π² ΡΠ°ΠΌΠΎΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΈ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π±ΡΡΡ ΡΠ²Π΅ΡΠ΅Π½Ρ, ΡΡΠΎ ΡΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΈΡΡΠΈΠ½Π½ΠΎΠΉ. Π₯ΠΎΡΡ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡ, ΠΈΠΌΠ΅Π΅Ρ Π»ΠΈ ΠΏΡΠ°Π²ΠΎ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡ Π² Π½Π΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΡΡΠΎ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π½Π΅ Π΄Π°Π΅Ρ ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎΡΡΠΈ. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΎΠ΄Π½Ρ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Ρ (ΠΎ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ°ΡΡΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π² ΡΠ²ΡΠ·ΠΈ Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΠΌΠΈ System V Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 6.8), Π½ΠΎ ΡΡΠΎ ΠΏΠ»ΠΎΡ ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡ Π΄Π»Ρ Π±ΠΎΠ»ΡΡΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Π΅ΡΠ»ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΎΡΠ΅ΡΠ΅Π΄ΡΠΌΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ (ΠΊΠ°ΠΊ ΠΌΡ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 5.8), Π° Π½Π΅ ΠΊΠ°ΠΊ ΡΠ°ΡΡΡ ΡΠ΄ΡΠ°, ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ²Π΅ΡΡΡΡ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΠ± ΠΎΡΠΏΡΠ°Π²ΠΈΡΠ΅Π»Π΅, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΠΌ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π΅Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ΄Π΄Π΅Π»Π°ΡΡ.
ΠΡΠΈΠΌΠ΅Ρ: ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° mqsend
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 5.5 ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ ΡΠ΅ΠΊΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΠ΅ΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ.
ΠΠΈΡΡΠΈΠ½Π³ 5.5. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° mqsend//pxmsg/mqsend.c
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
5 mqd_t mqd;
6 void *ptr;
7 size_t len;
8 uint_t prio;
9 if (argc != 4)
10 err_quit("usage: mqsend <name> <#bytes> <priority>");
11 len = atoi(argv[2]);
12 prio = atoi(argv[3]);
13 mqd = Mq_open(argv[1], O_WRONLY);
14 ptr = Calloc(len, sizeof (char));
15 Mq_send(mqd, ptr, len, prio);
16 exit(0);
17 }
Π ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΈ Π΅Π³ΠΎ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΡΠ²Π»ΡΡΡΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ. ΠΡΡΠ΅Ρ ΠΏΠΎΠ΄ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π²ΡΠ΄Π΅Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ callΠΎΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ Π΅Π³ΠΎ Π½ΡΠ»Π΅ΠΌ.
ΠΡΠΈΠΌΠ΅Ρ: ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° mqreceive
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 5.6 ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ.
ΠΠΈΡΡΠΈΠ½Π³ 5.6. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° mqreceive//pxmsg/mqreceive.Ρ
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
5 int Ρ flags;
6 mqd_t mqd;
7 ssize_t n;
8 uint_t prio;
9 void *buff;
10 struct mq_attr attr;
11 flags = O_RDONLY;
12 while ((c = Getopt(argc, argv, "n")) != β1) {
13 switch (c) {
14 case 'n':
15 flags |= O_NONBLOCK;
16 break;
17 }
18 }
19 if (optind != argc β 1)
20 err_quit("usage: mqreceive [ βn ] <name>");
21 mqd = Mq_open(argv[optind], flags);
22 Mq_getattr(mqd, &attr);
23 buff = Malloc(attr.mqjnsgsize);
24 n = Mq_receive(raqd, buff, attr.mq_msgsize, &prio);
25 printf("read %ld bytes, priority = %u\n", (long) n, prio);
26 exit(0);
27 }
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ -n Π·Π°ΠΏΡΠ΅ΡΠ°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ14-17 ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ βn ΠΎΡΠΊΠ»ΡΡΠ°Π΅Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ. ΠΡΠΈ ΡΡΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅, Π΅ΡΠ»ΠΈ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π½Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ.
ΠΡΠΊΡΡΡΠΈΠ΅ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΈ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠΎΠ²21-25 ΠΡ ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π΅Π΅ Π°ΡΡΠΈΠ±ΡΡΡ, Π²ΡΠ·Π²Π°Π² mq_getattr. ΠΠ°ΠΌ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π½ΡΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π²ΡΠ΄Π΅Π»ΠΈΡΡ Π±ΡΡΠ΅Ρ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ΅Π³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°, ΡΡΠΎΠ±Ρ Π²ΡΠ·Π²Π°ΡΡ mq_receive. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠ²ΠΎΠ΄ΠΈΡ ΡΠ°Π·ΠΌΠ΅Ρ ΡΡΠΈΡΡΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΈ Π΅Π³ΠΎ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ.
ΠΠ ΠΠΠΠ§ΠΠΠΠ
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ n ΠΈΠΌΠ΅Π΅Ρ ΡΠΈΠΏ size_t ΠΈ ΠΌΡ Π½Π΅ Π·Π½Π°Π΅ΠΌ, int ΡΡΠΎ ΠΈΠ»ΠΈ long, ΠΌΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΠΌ ΡΡΡ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ ΠΊ ΡΠΈΠΏΡ long ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΡΡΡΠΎΠΊΡ ΡΠΎΡΠΌΠ°ΡΠ° %ld. Π 64-ΡΠ°Π·ΡΡΠ΄Π½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ int Π±ΡΠ΄Π΅Ρ 32-ΡΠ°Π·ΡΡΠ΄Π½ΡΠΌ ΡΠ΅Π»ΡΠΌ, a long ΠΈ size_t Π±ΡΠ΄ΡΡ 64-ΡΠ°Π·ΡΡΠ΄Π½ΡΠΌΠΈ ΡΠ΅Π»ΡΠΌΠΈ.
ΠΠΎΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΎΠ±Π΅ΠΈΠΌΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌΠΈ, ΡΡΠΎΠ±Ρ ΠΏΡΠΎΠΈΠ»Π»ΡΡΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΠ»Ρ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ°.
solaris % mqcreate /test1
solaris % mqgetattr /test1 ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΈ ΡΠΌΠΎΡΡΠΈΠΌ Π½Π° Π΅Π΅ Π°ΡΡΠΈΠ±ΡΡΡ
max #msgs = 128, max #bytes/msg = 1024, #currently on queue = 0
solaris % mqsend /test1 100 99999 ΠΎΡΠΏΡΠ°Π²ΠΊΠ° Ρ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ°
mq_send error: Invalid argument
solaris % mqsend /test1 100 6 100 Π±Π°ΠΉΡ, ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ 6
solaris % mqsend /test1 50 18 50 Π±Π°ΠΉΡ, ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ 18
solaris % mqsend /test1 33 18 33 Π±Π°ΠΉΡ, ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ 18
solaris % mqreceive /test1
read 50 bytes, priority = 18 Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΡΡΠ°ΡΠ΅ΠΉΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ
solaris % mqreceive /test1 Π½Π°ΠΈΠ²ΡΡΡΠΈΠΌ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠΌ
read 33 bytes, priority = 18
Solaris % mqreceive /test1
read 100 bytes, priority = 6
Solaris % mqreceive βn /test1 ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΡ ΠΈ ΡΠ±Π΅ΠΆΠ΄Π°Π΅ΠΌΡΡ, ΡΡΠΎ ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΏΡΡΡΠ°
mq_receive error: Resource temporarily unavailable
ΠΡ Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ mq_receive Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΡΠ°ΡΠ΅ΠΉΡΠ΅Π΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Ρ Π½Π°ΠΈΠ²ΡΡΡΠΈΠΌ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠΌ.
5.5. ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ
ΠΡ ΡΠΆΠ΅ ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π»ΠΈΡΡ Ρ Π΄Π²ΡΠΌΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΠΌΠΈ, ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌΡΠΌΠΈ Π΄Π»Ρ Π»ΡΠ±ΠΎΠΉ ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π² ΠΌΠΎΠΌΠ΅Π½Ρ Π΅Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ:
β mq_maxmsg β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ;
β mq_msgsize β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ.
ΠΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΊΠ°ΠΊΠΈΡ -Π»ΠΈΠ±ΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ Π½Π° ΡΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, Ρ ΠΎΡΡ Π² ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°Π»ΠΈΡΠΈΠ΅ Π² ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΌΠ΅ΡΡΠ° Π΄Π»Ρ ΡΠ°ΠΉΠ»Π° ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΡΡΠΈ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ ΠΌΠΎΠ³ΡΡ Π½Π°ΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ (ΡΠΌ. ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 5.5).
ΠΡΡΠ³ΠΈΠ΅ Π΄Π²Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ:
β MQ_OPEN_MAX β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡΠΊΡΡΡΡ ΠΊΠ°ΠΊΠΈΠΌ-Π»ΠΈΠ±ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΠΌ (Posix ΡΡΠ΅Π±ΡΠ΅Ρ, ΡΡΠΎΠ±Ρ ΡΡΠ° Π²Π΅Π»ΠΈΡΠΈΠ½Π° Π±ΡΠ»Π° Π½Π΅ ΠΌΠ΅Π½ΡΡΠ΅ 8);
β MQ_PRIO_MAX β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° ΠΏΠ»ΡΡ ΠΎΠ΄ΠΈΠ½ (Posix ΡΡΠ΅Π±ΡΠ΅Ρ, ΡΡΠΎΠ±Ρ ΡΡΠ° Π²Π΅Π»ΠΈΡΠΈΠ½Π° Π±ΡΠ»Π° Π½Π΅ ΠΌΠ΅Π½ΡΡΠ΅ 32).
ΠΡΠΈ Π΄Π²Π΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ ΡΠ°ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΡΡΡΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡΠ½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ <unistd.h> ΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Ρ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²ΡΠ·ΠΎΠ²ΠΎΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ sysconf, ΠΊΠ°ΠΊ ΠΌΡ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π΄Π°Π»Π΅Π΅.
ΠΡΠΈΠΌΠ΅Ρ: ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° mqsysconf
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 5.7 Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ sysconf ΠΈ Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π΄Π²Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ.
ΠΠΈΡΡΠΈΠ½Π³ 5.7. ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ sysconf//pxmsg/mqsysconf.Ρ
1 #include "unpipc.h"
2 int
3 main(int argc, char **argv)
4 {
5 printf("MQ_OPEN_MAX = %ld, MQ_PRIO_MAX = %ld\n",