Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π² QNX/Neutrino 2. Руководство ΠΏΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Π² QNX Realtime PlatformΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 82

Автор Π ΠΎΠ± ΠšΡ‘Ρ€Ρ‚Π΅Π½

}

ΠžΡ‚ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ нСсколько Π²Π΅Ρ‰Π΅ΠΉ.

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ io_msg() для «инкапсуляции» ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ сообщСния (ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ Β«msgΒ») Π² структуру io_message использован Π΄Π²ΡƒΡ…ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π½Ρ‹ΠΉ Π²Π΅ΠΊΡ‚ΠΎΡ€ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° IOV.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° io_message Π±Ρ‹Π»Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Π½ΡƒΠ»Π΅Π½Π°, ΠΈ Π² Π½Π΅ΠΉ Π±Ρ‹Π» Π·Π°Π΄Π°Π½ Ρ‚ΠΈΠΏ сообщСния (_IO_MSG), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ ΠΏΠΎΠ»Π΅ cmd (это Π±ΡƒΠ΄Π΅Ρ‚ использовано администратором рСсурса для опрСдСлСния Ρ‚ΠΈΠΏΠ° посылаСмого сообщСния).

Π’ качСствС ΠΊΠΎΠ΄Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ io_msg() использовался нСпосрСдствСнно ΠΊΠΎΠ΄ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ MsgSendv().

ЕдинствСнная «забавная» Π²Π΅Ρ‰ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Ρ‚ΡƒΡ‚ сдСлали, касаСтся поля mgrid. QSSL Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΠ΅Ρ‚ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ поля Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ со ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΠ΄Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠΌ для Β«Π½Π΅ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ…Β» Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠ². Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ значСниями ΠΎΡ‚ _IOMGR_PRIVATE_BASE Π΄ΠΎ IOMGR_PRIVATE_MAX соотвСтствСнно. Если Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ Π³Π»ΡƒΠ±ΠΎΠΊΠΎ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π΅ΠΌΡƒΡŽ систСму ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ ваш администратор рСсурса Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… нСподходящих сообщСний, Ρ‚ΠΎ смСло ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ значСния ΠΈΠ· этого ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Ссли Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ Π² большСй стСпСни Β«Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠ½ΡƒΡŽΒ» ΠΈΠ»ΠΈ Β«ΠΎΠ±Ρ‹Ρ‡Π½ΡƒΡŽΒ» систСму, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΏΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π±ΡƒΠ΄ΡƒΡ‚ Π»ΠΈ Π²Π°ΡˆΠ΅ΠΌΡƒ администратору рСсурса ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π½Π΅ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ сообщСния ΠΈΠ»ΠΈ Π½Π΅Ρ‚. Π’ этом случаС Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π² QSSL Π·Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ mgrid, Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ для вас β€” Π½ΠΈΠΊΡ‚ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ вас, Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это Π½ΠΎΠΌΠ΅Ρ€. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Ρ„Π°ΠΉΠ» <sys/iomgr.h>, Ρ‚Π°ΠΌ прСдставлСны ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π² настоящСС врСмя Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹. Π’ нашСм Π²Ρ‹ΡˆΠ΅ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½ΠΎΠΌ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ COMMAND_XYZ Π±Π°Π·ΠΈΡ€ΠΎΠ²Π°Π½Π° Π½Π° _IOMGR_PRIVATE_BASE:

#define COMMAND_XYZ (_IOMGR_PRIVATE_BASE + 0x0007)

ΠΈΠ»ΠΈ QSSL Π½Π°Π·Π½Π°Ρ‡ΠΈΠ»Π° Π½Π°ΠΌ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½:

#define COMMAND_XYZ ( IOMGR_ACME_CORP + 0x0007)

Β«ΠšΠ»ΠΈΠ΅Π½Ρ‚/сСрвСр» с использованиСм администратора Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°

А Ρ‡Ρ‚ΠΎ Ссли ΠΊΠ»ΠΈΠ΅Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹ пСрСноситС, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ администратор Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°? Как Π°Π΄Π°ΠΏΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для QNX/ Neutrino? ΠžΡ‚Π²Π΅Ρ‚ прост: ΠΌΡ‹ ΡƒΠΆΠ΅ это сдСлали. Установив интСрфСйс Π½Π° основС Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… дСскрипторов, ΠΌΡ‹ ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ администратор рСсурса. Π’ QNX/Neutrino Π²Π°ΠΌ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ придСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ интСрфСйс «сырых» сообщСний. ΠŸΠΎΡ‡Π΅ΠΌΡƒ?

1. Π’Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ самим Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ ΠΎ сообщСнии _IO_CONNECT, ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠΈΠΌ с клиСнтским Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ open(), ΠΈΠ»ΠΈ ΠΈΡΠΊΠ°Ρ‚ΡŒ способ поиска администратор рСсурса, Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ использованию open().

2. Π’Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΈΡΠΊΠ°Ρ‚ΡŒ способ ΡΠΎΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ контСкстный Π±Π»ΠΎΠΊ Π² администраторС рСсурса. Π­Ρ‚ΠΎ, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π΅ ракСтная Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ°, Π½ΠΎ ΠΏΠΎΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ придСтся.

3. Π’Π°ΠΌ придСтся ΠΈΠ½ΠΊΠ°ΠΏΡΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС ваши сообщСния Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ вмСсто использования стандартных POSIX-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±Ρ‹ сдСлали эту Ρ€Π°Π±ΠΎΡ‚Ρƒ Π·Π° вас.

4. Π’Π°Ρˆ администратор рСсурса Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с прилоТСниями Π½Π° основС stdin/stdout. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с Π°ΡƒΠ΄ΠΈΠΎΠ΄Ρ€Π°ΠΉΠ²Π΅Ρ€ΠΎΠΌ Π²Ρ‹ Π½Π΅ смогли Π±Ρ‹ просто Ρ‚Π°ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ mp3_decode spud.mp3 >/dev/audio, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ open(), скорСС всСго, Π½Π΅ сработала Π±Ρ‹ (Π° Ссли Π±Ρ‹ ΠΈ сработала, Ρ‚ΠΎ Π½Π΅ сработала Π±Ρ‹ write(), ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅).

ΠŸΡ€ΠΎΠΊΡΠΈ

Π’ QNX4 СдинствСнным способом ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π½Π΅Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ сообщСния Π±Ρ‹Π»ΠΎ созданиС прокси β€” это дСлалось с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ qnx_proxy_attach(). Π­Ρ‚Π° функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ прокси (proxy ID), (ΠΎΠ½ выбираСтся ΠΈΠ· Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ самого пространства Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ², Ρ‡Ρ‚ΠΎ ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ процСссов), ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π²Ρ‹ Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Trigger() ΠΈΠ»ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прСрывания (см. Π½ΠΈΠΆΠ΅).

Π’ QNX/Neutrino Π²Ρ‹ Π±Ρ‹ вмСсто этого настроили структуру struct sigevent Π½Π° Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ Β«ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠ°Β», Π° ΠΏΠΎΡ‚ΠΎΠΌ Π»ΠΈΠ±ΠΎ использовали Π±Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ MsgDeliverEvent() для доставки события, Π»ΠΈΠ±ΠΎ привязали Π±Ρ‹ событиС ΠΊ Ρ‚Π°ΠΉΠΌΠ΅Ρ€Ρƒ ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ прСрывания.

ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ распознавания прокси-сообщСний QNX4 (ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Receive() ΠΈΠ»ΠΈ Creceive()) β€” ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΏΡ€ΠΈΠ΅ΠΌΠ° сообщСния, с ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹ΠΌ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ прокси. Если ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ β€” Π·Π½Π°Ρ‡ΠΈΡ‚, это прокси. Как Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ сообщСниС ΠΊΠ°ΠΊ «стандартноС». К соТалСнию, это нСсколько услоТняСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ пСрСноса ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

Анализ прокси ΠΏΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌ

Если Π²Ρ‹ сравниваСтС ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ процСсса со списком ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡ‹Ρ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² прокси, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ содСрТимоС прокси. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², коль скоро содСрТимоС прокси нСльзя ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ послС Π΅Π΅ создания, ΠΊΠ°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠΊ с Π°Π½Π°Π»ΠΈΠ·Π° сообщСния, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ это ΠΎΠ΄Π½Π° ΠΈΠ· Π²Π°ΡˆΠΈΡ… прокси? Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΎΠ·Ρ€Π°Π·ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ это для удобства β€” ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² прокси Π½ΡƒΠΆΠ½Ρ‹Π΅ сообщСния, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ всС сообщСния ΠΎΠ΄Π½ΠΈΠΌ стандартным Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ΠΎΠΌ. Если это ваш случай, см. Π½ΠΈΠΆΠ΅ «Анализ прокси ΠΏΠΎ содСрТимому».

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Π² QNX4 ваш ΠΊΠΎΠ΄ выглядСл Π±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

pid = Receive(0, &msg, sizeof(msg));

if (pid == proxyPidTimer) {

 // Π‘Ρ€Π°Π±ΠΎΡ‚Π°Π» наш Ρ‚Π°ΠΉΠΌΠ΅Ρ€, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ

} else if (pid == proxyPidISR) {

 // Π‘Ρ€Π°Π±ΠΎΡ‚Π°Π» наш ISR, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ

} else {

 // НС наша прокси β€” Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅

 // клиСнтскоС сообщСниС. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ.

}

Π’ QNX/Neutrino ΠΎΠ½ замСнился Π±Ρ‹ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

rcvid = MsgReceive(chid, &msg, sizeof(msg), NULL);

if (rcvid == 0) { // 0 Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ‡Ρ‚ΠΎ это ΠΈΠΌΠΏΡƒΠ»ΡŒΡ

 switch (msg.pulse.code) {

 case MyCodeTimer:

  // Π‘Ρ€Π°Π±ΠΎΡ‚Π°Π» наш Ρ‚Π°ΠΉΠΌΠ΅Ρ€, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ

  break;

 case MyCodeISR:

  // Π‘Ρ€Π°Π±ΠΎΡ‚Π°Π» наш ISR, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ

  break;

 default:

  // НСизвСстный ΠΊΠΎΠ΄ ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠ°

  break;

 }

} else {

 // rcvid - Π½Π΅ Π½ΡƒΠ»ΡŒ, Π·Π½Π°Ρ‡ΠΈΡ‚, это ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ΅

 // клиСнтскоС сообщСниС. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ.

}

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ это ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для случая, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚Π΅ сообщСния ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Но ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ администратора рСсурсов, Π½Π° самом Π΄Π΅Π»Π΅ ваша ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° выглядСла Π±Ρ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Ρ‚Π°ΠΊ:

int main(int argc, char **argv) {

 ...

 // Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

 pulse_attach(dpp, 0, MyCodeTimer, my_timer_pulse_handler,

  NULL);

 pulse_attach(dpp, 0, MyCodeISR, my_isr_pulse_handler,

  NULL);

 ...

}

На этот Ρ€Π°Π· ΠΌΡ‹ прСдписываСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ администратора рСсурсов ввСсти Π΄Π²Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π² основной Ρ†ΠΈΠΊΠ» ΠΏΡ€ΠΈΠ΅ΠΌΠ° сообщСний ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π²Π΅ наши Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ (my_timer_pulse_handler() ΠΈ my_isr_pulse_handler()) всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹. Π“ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅.

Анализ прокси ΠΏΠΎ содСрТимому

Если Π²Ρ‹ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ содСрТимоС прокси (фактичСски игнорируя, Ρ‡Ρ‚ΠΎ это прокси, ΠΈ обрабатывая ΠΈΡ… ΠΊΠ°ΠΊ сообщСния), Ρ‚ΠΎ Π²Ρ‹ автоматичСски ΠΈΠΌΠ΅Π΅Ρ‚Π΅ Π΄Π΅Π»ΠΎ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² QNX4 Π½Π° прокси ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ нСльзя. Π’ QNX/Neutrino ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° ΠΈΠΌΠΏΡƒΠ»ΡŒΡ Ρ‚ΠΎΠΆΠ΅ нСльзя. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ρƒ вас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π»ΠΈΠ±ΠΎ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΏΡ€ΠΈΠ΅ΠΌΠ°, ΠΈ опрСдСляСт, Ρ‡Ρ‚ΠΎ это прокси, ΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π½Π΅ Π½Π°Π΄ΠΎ, Π»ΠΈΠ±ΠΎ смотрит Π½Π° содСрТимоС сообщСния ΠΈ ΠΏΠΎ Π½Π΅ΠΌΡƒ опрСдСляСт, Π½Π°Π΄ΠΎ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π½Π° это сообщСниС ΠΈΠ»ΠΈ Π½Π΅Ρ‚.

К соТалСнию Π² QNX/Neutrino ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΈΠΌΠΏΡƒΠ»ΡŒΡ Π½Π΅ Π·Π°ΠΏΠΈΡ…Π½Π΅ΡˆΡŒ. Π˜ΠΌΠΏΡƒΠ»ΡŒΡ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ структуру, ΠΈ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ это нСльзя. Π£ΠΌΠ½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ здСсь Π±Ρ‹Π»ΠΎ Π±Ρ‹ Β«ΠΈΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΒ» сообщСниС ΠΎΡ‚ прокси ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠ° ΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹. Π’Π°Π±Π»ΠΈΡ†Π° содСрТала Π±Ρ‹ сообщСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π»ΠΈΡΡŒ посрСдством прокси. ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ² ΠΈΠΌΠΏΡƒΠ»ΡŒΡ, Π²Ρ‹ использовали Π±Ρ‹ ΠΏΠΎΠ»Π΅ value Π² качСствС индСкса ΠΊ этой Ρ‚Π°Π±Π»ΠΈΡ†Π΅, Π²Ρ‹Π±Ρ€Π°Π»ΠΈ Π±Ρ‹ ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ сообщСниС ΠΈ Β«ΠΏΡ€ΠΈΡ‚Π²ΠΎΡ€ΠΈΠ»ΠΈΡΡŒΒ», Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½ΠΎ.

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΉ Π² QNX4 ΠΌΠΎΠ³Π»ΠΈ Π»ΠΈΠ±ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ прокси (указывая этим, Ρ‡Ρ‚ΠΎ Π½Π°Π΄ΠΎ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ прокси ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΡƒΠ²Π΅Π΄ΠΎΠΌΠΈΡ‚ΡŒ Π΅Π΅ Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π° ΠΎ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠΈ), Π»ΠΈΠ±ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½ΡƒΠ»ΡŒ (Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π»ΠΎ Π±Ρ‹, Ρ‡Ρ‚ΠΎ Π² дальнСйшСм Π½ΠΈΡ‡Π΅Π³ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ трСбуСтся). Π’ QNX/Neutrino ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ β€” Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ вмСсто возвращСния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° прокси Π²Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° struct sigevent. Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ событиС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ ΠΈΠΌΠΏΡƒΠ»ΡŒΡΠΎΠΌ (блиТайший Π°Π½Π°Π»ΠΎΠ³ прокси), Π»ΠΈΠ±ΠΎ сигналом, Π»ΠΈΠ±ΠΎ созданиСм ΠΏΠΎΡ‚ΠΎΠΊΠ° β€” ΠΊΠ°ΠΊ Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚Π΅, Ρ‚Π°ΠΊ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚.

Π’Π°ΠΊΠΆΠ΅ Π² QNX4 Π²Ρ‹ обязаны Π±Ρ‹Π»ΠΈ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ прСрывания β€” Π΄Π°ΠΆΠ΅ Π² Ρ‚ΠΎΠΌ случаС, Ссли ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Π» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ прокси. Π’ QNX/Neutrino Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ struct sigevent ΠΊ Π²Π΅ΠΊΡ‚ΠΎΡ€Ρƒ прСрывания, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ InterruptAttachEvent(), ΠΈ это событиС Π±ΡƒΠ΄Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°.

РСзюмС

ΠŸΠ΅Ρ€Π΅Π½ΠΎΡ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ· QNX4 Π² QNX/Neutrino ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ Π² ΠΎΠ±Π΅ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСмах, β€” это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ссли ΠΏΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ»: