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, ΠΊΠ°ΠΊ ΡΡΠΎ Π±ΡΠ»ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² Π³Π»Π°Π²Π΅ Β«ΠΡΠΎΡΠ΅ΡΡΡ ΠΈ ΠΏΠΎΡΠΎΠΊΠΈΒ» Π² ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ ΠΏΡΠ»Π° ΠΏΠΎΡΠΎΠΊΠΎΠ².