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

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

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

struct _io_connect_link_reply {

 uint32_t reserved1[2];

 uint8_t  eflag;

 uint8_t  reserved2[3];

 uint32_t umask;

 uint16_t nentries;

 uint16_t path_len;

};


typedef union {

 struct _io_connect            connect;

 struct _io_connect_link_reply link_reply;

} io_unlink_t;

ОписаниС: ΠžΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ связСй (unlinking) Ρ„Π°ΠΉΠ»Π°, имя ΠΏΡƒΡ‚ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ пСрСдаСтся Π² ΠΏΠΎΠ»Π΅ path структуры входящСго сообщСния.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚: БостояниС ΠΏΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡŽ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ макроса _RESMGR_STATUS.

io_unlock_ocb()

int io_unlock_ocb(resmgr_context_t *ctp, void *reserved,

 RESMGR_OCB_T *ocb)

ΠšΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ: Ѐункция Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π° (синтСзируСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ)

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: iofunc_unlock_ocb_default()

Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: НСт

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠ°Ρ функция: ВсС

БообщСния: НСт (синтСзируСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ)

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° Π΄Π°Π½Π½Ρ‹Ρ…: НСт

ОписаниС: ДСйствуСт ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎ Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ io_lock_ocb(), Ρ‚.Π΅. ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Ρ€Π°Π·Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΉ записи, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ OCB. Π­Ρ‚Π° опСрация освобоТдаСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΡƒΡŽ запись, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ администратора рСсурсов ΠΌΠΎΠ³Π»ΠΈ с Π½Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ см. Π²Ρ‹ΡˆΠ΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ «БоставныС сообщСния».

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚: Код Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ макроса _RESMGR_STATUS.

io_utime()

int io_utime(resmgr_context_t *ctp, io_utime_t *msg,

 RESMGR_OCB_T *ocb)

ΠšΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ: Ѐункция Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: iofunc_utime_default()

Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: iofunc_utime()

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠ°Ρ функция: utime()

БообщСния: _IO_UTIME

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

struct _io_utime {

 uint16_t       type;

 uint16_t       combine_len;

 int32_t        cur_flag;

 struct utimbuf times;

};


typedef union {

 struct _io_utime i;

} io_utime_t;

ОписаниС: УстанавливаСт Π²Ρ€Π΅ΠΌΠ΅Π½Π° послСднСго доступа ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π»ΠΈΠ±ΠΎ Π² Β«Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚Β» (Ссли ΠΎΠ½ΠΈ Ρ€Π°Π²Π½Ρ‹ Π½ΡƒΠ»ΡŽ), Π»ΠΈΠ±ΠΎ Π² Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ значСния. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ согласно ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ POSIX этот ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ сообщСния ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ Ρ„Π»Π°Π³ΠΎΠ² IOFUNC_ATTR_* Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π½ΠΎΠΉ записи. Π’Π°ΠΌ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ придСтся ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ; вмСсто этого Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ POSIX-уровня.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚: Код Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ макроса _RESMGR_STATUS.

io_write()

int io_write(resmgr_context_t *ctp, io_write_t *msg,

 RESMGR_OCB_T *ocb)

ΠšΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ: Ѐункция Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ: iofunc_write_default()

Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: iofunc_write_verify()

ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠ°Ρ функция: write(), fwrite(), ΠΈ Ρ‚.ΠΏ.

БообщСния: _IO_WRITE

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

struct _io_write {

 uint16_t type;

 uint16_t combine_len;

 int32_t  nbytes;

 uint32_t xtype;

};


typedef union {

 struct _io_write i;

} io_write_t;

ОписаниС: Π”Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ записал Π² администратор рСсурсов. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ пСрСдаСтся число Π±Π°ΠΉΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ пытаСтся Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ, Π² элСмСнтС nbytes; Π΄Π°Π½Π½Ρ‹Π΅ нСявно ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ Π·Π° Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ структурой (Ссли ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ xtype Π½Π΅ установлСн Π² _IO_XTYPE_OFFSET; см. Π½ΠΈΠΆΠ΅ ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„ Β«ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ io_write()Β»!). Богласно Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, потрСбуСтся ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ считываниС ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° части сообщСния с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ resmgr_msgreadv() ΠΈΠ»ΠΈ Π΅ΠΉ эквивалСнтной. Код Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ Π΄Π°Π΅Ρ‚ число Π±Π°ΠΉΡ‚, фактичСски записанных, Π»ΠΈΠ±ΠΎ устанавливаСт ΠΏΡ€ΠΈΠ·Π½Π°ΠΊ ошибки Π² errno.

ΠžΡ‚ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΡΡ‚ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ» Π±Ρ‹Π» ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅, совмСстимом с записью, слСдуСт Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ iofunc_write_verify(). Π’Π°ΠΊΠΆΠ΅ слСдуСт Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ iofunc_sync_verify() для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ нСобходимости синхронизации Π΄Π°Π½Π½Ρ‹Ρ… с носитСлСм.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚: Код Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ, ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ макроса _IO_SET_WRITE_NBYTES.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ см. Π½ΠΈΠΆΠ΅ Π² ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ Β«ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ io_write()Β».

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹

Π­Ρ‚ΠΎΡ‚ Ρ€Π°Π·Π΄Π΅Π» β€” своСго Ρ€ΠΎΠ΄Π° «кулинарная ΠΊΠ½ΠΈΠ³Π°Β» для программистов. Π—Π΄Π΅ΡΡŒ я ΠΏΡ€ΠΈΠ²Π΅Π΄Ρƒ ряд Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ смоТСтС нСпосрСдствСнно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС базиса для Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ². Π­Ρ‚ΠΎ Π½Π΅ совсСм Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ администраторы рСсурсов β€” Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈΡ… функциями Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΡƒΠ»Π°ΠΌΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ «каркасом» диспСтчСризации (ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π΅Ρ‡ΡŒ Π½ΠΈΠΆΠ΅), Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ΄ΠΎΡΡ‚ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ваши вСрсии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ- ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ послС Π²Ρ‹Π·ΠΎΠ²Π° iofunc_func_init(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ!

Π― Π½Π°Ρ‡Π½Ρƒ с ряда простых ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ², Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΡ… Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… сообщСний, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ:

β€’ io_read()

β€’ io_write()

β€’ io_devctl() (Π±Π΅Π· ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π΄Π°Π½Π½Ρ‹Ρ…)

β€’ io_devctl() (с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ…)

Π—Π°Ρ‚Π΅ΠΌ, Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΒ», ΠΌΡ‹ рассмотрим ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ io_read(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ элСмСнтов ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ каркас администратора рСсурсов

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС шаблона для ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ администратора рСсурсов. (Π¨Π°Π±Π»ΠΎΠ½ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ администратора рСсурсов ΠΌΡ‹ ΡƒΠΆΠ΅ рассматривали β€” это Π±Ρ‹Π»ΠΎ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° администратора рСсурсов», ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ обсуТдали администратор /dev/null).

#include <stdio.h>

#include <stdlib.h>

#include <stddef.h>

#include <sys/iofunc.h>

#include <sys/dispatch.h>


static resmgr_connect_funcs_t connect_func;

static resmgr_io_funcs_t io_func;

static iofunc_attr_t attr;


main(int argc, char **argv) {

 thread_pool_attr_t pool_attr;

 thread_pool_t      *tpp;

 dispatch_t         *dpp;

 resmgr_attr_t      resmgr_attr;

 resmgr_context_t   *ctp;

 int                id;

 if ((dpp = dispatch_create()) == NULL) {

  fprintf(stderr,

   "%s: Ошибка выдСлСния контСкста диспСтчСризации\n",

   argv[0]);

  return (EXIT_FAILURE);

 }

 memset(&pool_attr, 0, sizeof(pool_attr));

 pool_attr.handle = dpp;

 pool_attr.context_alloc = resmgr_context_alloc;

 pool_attr.block_func = resmgr_block;

 pool_attr.handler_func = resmgr_handler;

 pool_attr.context_free = resmgr_context_free;


 // 1) ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡƒΠ» ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²

 pool_attr.lo_water = 2;

 pool_attr.hi_water = 4;

 pool_attr.increment = 1;

 pool_attr.maximum = 50;

 if ((tpp =

  thread_pool_create(&pool_attr, POOL_FLAG_EXIT_SELF))

   == NULL) {

  fprintf(stderr,

   "%s: Ошибка ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²\n",

  argv[0]);

  return (EXIT_FAILURE);

 }

 iofunc_func_init(_RESMGR_CONNECT_NFUNCS, &connect_func,

  _RESMGR_IO_NFUNCS, &io_func);

 iofunc_attr_init(&attr, S_IFNAM | 0777, 0, 0);


 // 2) ΠŸΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ установлСния соСдинСния

 // ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°/Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ

 memset(&resmgr_attr, 0, sizeof(resmgr_attr));

 resmgr_attr.nparts_max = 1;

 resmgr_attr.msg_max_size = 2048;


 // 3) Π—Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ Β«/dev/whateverΒ» Π½Π° Π½ΡƒΠΆΠ½Ρ‹ΠΉ прСфикс

 if ((id =

  resmgr_attach(dpp, &resmgr_attr, "/dev/whatever",

   _FTYPE_ANY,

   0, &connect_func, &io_func, &attr)) == -1) {

  fprintf(stderr, "%s: Ошибка рСгистрации прСфикса\n",

   argv[0]);

  return (EXIT_FAILURE);

 }

 // ΠžΡ‚ΡΡŽΠ΄Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚

 thread_pool_start(tpp);

}

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± интСрфСйсС диспСтчСризации (Ρ‚.Π΅., ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ dispatch_create()), см. Π² справочном руководствС ΠΏΠΎ Π‘ΠΈ-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ (Π‘ Library Reference).

Π­Ρ‚Π°ΠΏ 1

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² для создания ΠΏΡƒΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ сообщСния Π² нашСм администраторС рСсурсов. Π’ΠΎΠΎΠ±Ρ‰Π΅ говоря, я Π±Ρ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π» Π²Π°ΠΌ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ администратора рСсурсов, ΠΊΠ°ΠΊ ΠΌΡ‹ это Π΄Π΅Π»Π°Π»ΠΈ Ρ€Π°Π½Π΅Π΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с администратором /dev/null. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ базовая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρƒ вас Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π²Ρ‹ смоТСтС Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΡΡ‚ΡŒ. Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π΄Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ lo_water, hi_water, increment ΠΈ maximum структуры pool_attr, ΠΊΠ°ΠΊ это Π±Ρ‹Π»ΠΎ описано Π² Π³Π»Π°Π²Π΅ Β«ΠŸΡ€ΠΎΡ†Π΅ΡΡΡ‹ ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΈΒ» Π² обсуТдСниях Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡƒΠ»Π° ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².