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

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

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

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΠ΅Ρ€Π²ΠΎΠ΅, Π² Ρ‡Π΅ΠΌ слСдуСт Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ, β€” это структуры Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:

β€’ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π°Ρ структура resmgr_attr_t

β€’ Ρ‚Π°Π±Π»ΠΈΡ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ установлСния соСдинСния resmgr_connect_funcs_t

β€’ Ρ‚Π°Π±Π»ΠΈΡ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° resmgr_io_funcs_t ΠΈ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° внутрСнняя структура Π΄Π°Π½Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:

β€’ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Π±Π»ΠΎΠΊ контСкста resmgr_context_t

ПозТС ΠΌΡ‹ рассмотрим Ρ‚Π°ΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊ Π±Π»ΠΎΠΊ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΎΠ³ΠΎ контСкста (OCB), Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΡƒΡŽ запись (attributes structure) ΠΈ запись Ρ‚ΠΎΡ‡ΠΊΠΈ монтирования (mount structure), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ POSIX-ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

Π£ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π°Ρ структура resmgr_attr_t

Π£ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π°Ρ структура (Ρ‚ΠΈΠΏΠ° resmgr_attr_t) пСрСдаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ resmgr_start(), которая нСсколько Π΅Π΅ элСмСнтов ΠΈ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° основной Ρ†ΠΈΠΊΠ» ΠΏΡ€ΠΈΠ΅ΠΌΠ° сообщСний.

Π£ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π°Ρ структура (взято ΠΈΠ· <sys/dispatch.h>) содСрТит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

typedef struct _resmgr_attr {

 unsigned flags;

 unsigned nparts_max;

 unsigned msg_max_size;

 int      (*other_func)(resmgr_context_t *ctp, void *msg);

} resmgr_attr_t;

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСний other_func

Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, использования этого элСмСнта слСдуСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ. Π­Ρ‚ΠΎΡ‚ элСмСнт, Ссли Π½Π΅ Ρ€Π°Π²Π΅Π½ NULL, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, которая Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π°, Ссли принято сообщСниС, Π½Π΅ распознанноС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ. Π₯ΠΎΡ‚ΡŒ это ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ «нСстандартных» сообщСний, Π½ΠΎ это Π½Π΅Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° (примСняйтС Π»ΠΈΠ±ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ _IO_DEVCTL, Π»ΠΈΠ±ΠΎ _IO_MSG β€” см. Π½ΠΈΠΆΠ΅). Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ входящиС ΠΈΠΌΠΏΡƒΠ»ΡŒΡΡ‹, Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽ для этого ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ pulse_attach().

Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ Ρƒ этого элСмСнта Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ структур Π΄Π°Π½Π½Ρ‹Ρ…

Π­Ρ‚ΠΈ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для управлСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ областСй памяти, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΡ€ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π΅ сообщСниями.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ nparts_max управляСт Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ динамичСски выдСляСмого Π²Π΅ΠΊΡ‚ΠΎΡ€Π° Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° (элСмСнт iov Π² структурС Ρ‚ΠΈΠΏΠ° resmgr_context_t β€” контСкстном Π±Π»ΠΎΠΊΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ администратора рСсурсов, см. Π½ΠΈΠΆΠ΅). ΠžΠ±Ρ‹Ρ‡Π½ΠΎ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎΠ΄ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ одноэлСмСнтный Π²Π΅ΠΊΡ‚ΠΎΡ€ Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° (IOV). ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ примСняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ исходящим сообщСниям Π½Π° ΠΏΠΎΡΡ‚ΡƒΠΏΠ°ΡŽΡ‰ΠΈΠ΅ сообщСния Π½Π΅ влияСт.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ msg_max_size управляСт Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π±ΡƒΡ„Π΅Ρ€Π½ΠΎΠ³ΠΎ пространства, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° администратора рСсурсов Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ входящСС сообщСниС. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° администратора рСсурсов установит этот ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π½Π°ΠΈΠ±ΠΎΠ»ΡŒΡˆΠ΅ΠΌΡƒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΡƒ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ³ΠΎ сообщСния. Π­Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Π²Π°Π½Π° функция- ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ, Π΅ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ сообщСния. ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Ρ‡Ρ‚ΠΎ присутствиС Π² Π±ΡƒΡ„Π΅Ρ€Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ… (Ссли Ρ‚Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ) Π½Π΅ гарантируСтся, Π΄Π°ΠΆΠ΅ Ссли ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ msg_max_size Π·Π°Π΄Π°Π½ достаточно большим. (Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² ΠΎΠ±ΡΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ Β«Π’Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ контСкстный Π±Π»ΠΎΠΊ resmgr_context_tΒ», см. Π½ΠΈΠΆΠ΅).

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ flags

Π­Ρ‚ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π΄Π°Π΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ администратора рСсурсов Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Π’ нашСм случаС ΠΌΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΄ΠΈΠΌ просто Π½ΡƒΠ»ΡŒ (0). Π”Ρ€ΡƒΠ³ΠΈΠ΅ значСния этого ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² справочном руководствС ΠΏΠΎ Π‘ΠΈ-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅, Π² Ρ€Π°Π·Π΄Π΅Π»Π΅, посвящСнном Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ resmgr_attach().

Π’Π°Π±Π»ΠΈΡ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ установлСния соСдинСния resmgr_connect_funcs_t

Когда Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° администратора рСсурсов ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ сообщСниС, ΠΎΠ½Π° провСряСт Ρ‚ΠΈΠΏ сообщСния ΠΈ смотрит, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ содСрТит Π΄Π²Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ это ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ Ρ‚Π°Π±Π»ΠΈΡ†Π° Ρ‚ΠΈΠΏΠ° resmgr_connect_funcs_t, которая содСрТит список ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сообщСний установлСния соСдинСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Π° Ρ‚ΠΈΠΏΠ° Π³Π΅smgr_io_funсs_t, которая содСрТит Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΉ список ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сообщСний Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° β€” Π΅Π΅ ΠΌΡ‹ рассмотрим нСсколько ΠΏΠΎΠ·ΠΆΠ΅.

Когда ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ врСмя Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ установлСния соСдинСния ΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, рСкомСндуСтся сначала Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ iofunc_func_init(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ функциями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ POSIX. Π’ΠΎΠ³Π΄Π°, Ссли Π²Π°ΠΌ потрСбуСтся Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ сообщСния, Π²Ρ‹ просто подставляСтС вмСсто POSIX-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ свою ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. ΠœΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ это Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«ΠŸΠΎΠ΄ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° своих собствСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉΒ». А сСйчас Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим собствСнно Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ установлСния соСдинСния (взято ΠΈΠ· <sys/resmgr.h>):

typedef struct _resmgr_connect_funcs {

 unsigned nfuncs;

 int (*open)(ctp, io_open_t *msg, handle, void *extra);

 int (*unlink)(ctp, io_unlink_t *msg, handle,

  void *reserved);

 int (*rename)(ctp, io_rename_t *msg, handle,

  io_rename_extra_t *extra);

 int (*mknod)(ctp, io_mknod_t *msg, handle,

  void *reserved);

 int (*readlink)(ctp, io_readlink_t *msg, handle,

  void *reserved);

 int (*link)(ctp, io_link_t *msg, handle,

  io_link_extra_t *extra);

 int (*unblock)(ctp, io_pulse_t *msg, handle,

  void *reserved);

 int (*mount) (ctp, io_mount_t *msg, handle,

  io_mount_extra_t *extra);

} resmgr_connect_funcs_t;

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ я сократил ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹, опустив Ρ‚ΠΈΠΏ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, ctp (resmgr_context_t*), ΠΈ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ, handle (RESMGR_HANDLE_T).

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ для, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ open() Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄:

int (*open)(resmgr_context_t *ctp, io_open_t *msg,

 RESMGR_HANDLE_T *handle, void *extra);

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт структуры (nfuncs) ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, насколько ΠΎΠ½Π° Π²Π΅Π»ΠΈΠΊΠ° (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ сколько Π² Π½Π΅ΠΉ содСрТится элСмСнтов). Для ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ структуры ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π΅Π½ 8, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ элСмСнтов Π² Π½Π΅ΠΉ восСмь (ΠΎΡ‚ open() Π΄ΠΎ mount()). Π­Ρ‚ΠΎΡ‚ элСмСнт Π½ΡƒΠΆΠ΅Π½ Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ΡŒ QSSL ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Π΄Π°Π½Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ… Π±Ρ‹ Ρ‚ΠΎ Π½ΠΈ Π±Ρ‹Π»ΠΎ Π²Ρ€Π΅Π΄Π½Ρ‹Ρ… послСдствий для вашСго ΠΊΠΎΠ΄Π°. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ свой ΠΊΠΎΠ΄ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 8, Π° Π·Π°Ρ‚Π΅ΠΌ QSSL ΠΎΠ±Π½ΠΎΠ²ΠΈΠ»Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ стал Ρ€Π°Π²Π΅Π½ 9. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΌΠΎΠ³Π»Π° Π±Ρ‹ сСбС ΡΠΊΠ°Π·Π°Ρ‚ΡŒ: «Ага! ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π±Ρ‹Π» скомпилирован с расчСтом Π½Π° 8 Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π° ΠΈΡ… Ρƒ нас Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ 9. Надо Π±Ρ‹ Π½Π°Π·Π½Π°Ρ‡ΠΈΡ‚ΡŒ 9-ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.Β» Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° nfuncs хранится Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ <sys/resmgr.h> Π² Π²ΠΈΠ΄Π΅ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠΉ константы _RESMGR_CONNECT_NFUNCS. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ эту константу ΠΏΡ€ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ установлСния соСдинСния Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ (хотя Π»ΡƒΡ‡ΡˆΠ΅ всСго ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ для этого Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ iofunc_func_init()).

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Ρƒ всСх ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠΎΠ² ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ctp, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° структуру resmgr_context_t. Π­Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ контСкстный Π±Π»ΠΎΠΊ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ администратора рСсурсов ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π½Π΅ слСдуСт (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ поля, ΠΊ ΠΎΠ±ΡΡƒΠΆΠ΄Π΅Π½ΠΈΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ Π΅Ρ‰Π΅ вСрнСмся).

Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ всСгда ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° сообщСниС. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² сообщСний, Ρ‚ΠΈΠΏ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ΅ соотвСтствуСт Ρ‚ΠΈΠΏΡƒ сообщСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ данная функция Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ.

Π’Ρ€Π΅Ρ‚ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ β€” структура Ρ‚ΠΈΠΏΠ° RESMGR_HANDLE_T, называСмая дСскриптором (handle). Она ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ устройства, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π°Π»ΠΎΡΡŒ сообщСниС. ΠœΡ‹ Ρ‚ΠΎΠΆΠ΅ рассмотрим Π΅Π΅ ΠΏΠΎΠ·ΠΆΠ΅, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎΠ± Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΉ записи.

И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, послСдний ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ являСтся Β«Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹ΠΌΒ», ΠΈΠ»ΠΈ Β«Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΒ», ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. ΠœΡ‹ продСмонстрируСм ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° extra ΠΏΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ Π² обсуТдСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² сообщСний.

Π’Π°Π±Π»ΠΈΡ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° resmgr_io_funcs_t

Π’Π°Π±Π»ΠΈΡ†Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΠΎΠ΄ΠΎΠ±Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ установлСния соСдинСния. Π’ΠΎΡ‚ ΠΎΠ½Π° (взято ΠΈΠ· <sys/resmgr.h>):

typedef struct _resmgr_io_funcs {

 unsigned nfuncs;

 int (*read)(ctp, io_read_t *msg, ocb);

 int (*write)(ctp, io_write_t *msg, ocb);

 int (*close_ocb)(ctp, void *reserved, ocb);

 int (*stat)(ctp, io_stat_t *msg, ocb);

 int (*notify)(ctp, io_notify_t *msg, ocb);

 int (*devctl)(ctp, io_devctl_t *msg, ocb);

 int (*unblock)(ctp, io_pulse_t *msg, ocb);

 int (*pathconf)(ctp, io_pathconf_t *msg, ocb);

 int (*lseek)(ctp, io_lseek_t *msg, ocb);

 int (*chmod)(ctp, io_chmod_t *msg, ocb);

 int (*chown)(ctp, io_chown_t *msg, ocb);

 int (*utime)(ctp, io_utime_t *msg, ocb);

 int (*openfd)(ctp, io_openfd_t *msg, ocb);

 int (*fdinfo)(ctp, io_fdinfo_t *msg, ocb);

 int (*lock)(ctp, io_lock_t *msg, ocb);

 int (*space)(ctp, io_space_t *msg, ocb);

 int (*shutdown)(ctp, io_shutdown_t *msg, ocb);

 int (*mmap)(ctp, io_mmap_t *msg, ocb);

 int (*msg)(ctp, io_msg_t *msg, ocb);

 int (*umount)(ctp, void *msg, ocb);