QNX相關(guān)歷史文章:
POSIX-Layer Data Structures
這篇文章主要講述和POSIX-Layer例程支持相關(guān)的幾個(gè)關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。
1. Introduction
資源管理器定義了三個(gè)與POSIX-Layer相關(guān)的數(shù)據(jù)結(jié)構(gòu):
-
iofunc_ocb_t
茫孔,包含了每次打開的數(shù)據(jù)谣旁,比如打開文件的偏移等莉炉; -
iofunc_attr_t
洗做,資源管理器有時(shí)可能得管理多個(gè)設(shè)備驯嘱,比如devc-ser*
對(duì)應(yīng)到/dev/ser1
灶壶,/dev/ser2
等义郑,這個(gè)結(jié)構(gòu)包含一個(gè)名字對(duì)應(yīng)的數(shù)據(jù)蝶柿; -
iofunc_mount_t
,主要用于文件系統(tǒng)非驮,設(shè)備通常不需要這個(gè)結(jié)構(gòu)交汤;
三者之間的關(guān)系如下:
A resource manager is responsible for three data structures
Multiple clients with multiple OCBs, all linked to one mount structure
2. iofunc_ocb_t結(jié)構(gòu)
OCB
(Open Control Block)結(jié)構(gòu),用于維護(hù)客戶端和資源管理器之間特定會(huì)話的狀態(tài)信息劫笙,在open()
時(shí)創(chuàng)建芙扎,在close()
時(shí)退出。這個(gè)數(shù)據(jù)結(jié)構(gòu)用于iofunc layer
中的幫助函數(shù)填大。該結(jié)構(gòu)至少包含以下內(nèi)容:
typedef struct _iofunc_ocb {
IOFUNC_ATTR_T *attr;
int32_t ioflag;
off_t offset;
uint16_t sflag;
uint16_t flags;
} iofunc_ocb_t;
-
attr
戒洼,指向?qū)傩越Y(jié)構(gòu)體; -
ioflag
允华,包含了資源打開模式:O_RDONLY
/O_RDWR
/O_WRONLY
圈浇,對(duì)應(yīng)的ioflag
值為_IO_FLAG_RD
/_IO_FLAG_RD | _IO_FLAG_WR
/_IO_FLAG_WR
寥掐,這些信息從io_connect_t
結(jié)構(gòu)體中繼承得來; -
offset
磷蜀,讀寫資源的偏移召耘,資源管理器可以修改這個(gè)成員; -
sflag
蠕搜,定義共享模式怎茫,從io_connect_t
結(jié)構(gòu)中繼承得來收壕; -
flags
妓灌,當(dāng)設(shè)置IOFUNC_OCB_PRIVILEGED
位時(shí),特權(quán)進(jìn)程來執(zhí)行open()
操作蜜宪,此外也可以使用IOFUNC_OCB_FLAGS_PRIVATE
范圍之內(nèi)的flag虫埂。資源管理器可以修改這個(gè)成員;
3. iofunc_attr_t結(jié)構(gòu)
這個(gè)結(jié)構(gòu)為資源管理器提供了設(shè)備的特征圃验,與OCB
結(jié)構(gòu)結(jié)合使用掉伏。
typedef struct _iofunc_attr {
IOFUNC_MOUNT_T *mount;
uint32_t flags;
int32_t lock_tid;
uint16_t lock_count;
uint16_t count;
uint16_t rcount;
uint16_t wcount;
uint16_t rlocks;
uint16_t wlocks;
struct _iofunc_mmap_list *mmap_list;
struct _iofunc_lock_list *lock_list;
void *list;
uint32_t list_size;
off_t nbytes;
ino_t inode;
uid_t uid;
gid_t gid;
time_t mtime;
time_t atime;
time_t ctime;
mode_t mode;
nlink_t nlink;
dev_t rdev;
} iofunc_attr_t;
-
mount
,指向掛載結(jié)構(gòu)體澳窑; -
flags
斧散,可以是不同比特位的組合,包括:IOFUNC_ATTR_ATIME/IOFUNC_ATTR_CTIME/IOFUNC_ATTR_DIRTY_NLINK/IOFUNC_ATTR_DIRTY_MODE/IOFUNC_ATTR_DIRTY_OWNER/IOFUNC_ATTR_DIRTY_RDEV/IOFUNC_ATTR_DIRTY_SIZE/IOFUNC_ATTR_DIRTY_TIME/IOFUNC_ATTR_MTIME
摊聋,用于標(biāo)識(shí)修改記錄鸡捐。 -
lock_tid
和lock_count
,用于多線程的加鎖和統(tǒng)計(jì)麻裁; -
count, rcount, wcount, rlocks and wlocks
箍镜,計(jì)數(shù)值及鎖; -
mmap_list and lock_list
煎源,mmap_list
用于iofunc_mmap()
和iofunc_mmap_default()
函數(shù)色迂,lock_list
用于iofunc_lock_default()
函數(shù),通常用戶不需要修改會(huì)檢查這兩個(gè)成員手销; -
list and list_size
歇僧,保留字段; -
nbytes
锋拖,資源的字節(jié)數(shù)馏慨,比如對(duì)于文件來說,放置的就是文件的大泄糜纭写隶; -
inode
,特定掛載點(diǎn)的inode讲仰,每個(gè)掛載點(diǎn)都必須是唯一的慕趴; -
uid and gid
,資源的用戶ID和組ID,通常由chown()
等函數(shù)來更新冕房; -
mtime, atime, and ctime
躏啰,修改時(shí)間、訪問時(shí)間耙册,以及狀態(tài)改變時(shí)間给僵,是三個(gè)POSIX時(shí)間成員; -
mode
详拙,資源的模式帝际,定義在<sys/stat.h>
中,以S_*
開頭饶辙; -
nlink
蹲诀,鏈接數(shù)量; -
rdev
弃揽,包含字符特殊設(shè)備的設(shè)備號(hào)脯爪,以及指定專用設(shè)備的rdev
號(hào);
4. iofunc_mount_t結(jié)構(gòu)(可選)
這個(gè)結(jié)構(gòu)中的成員矿微,尤其是conf
和flags
痕慢,可以修改某些iofunc
層函數(shù)的行為。這個(gè)結(jié)構(gòu)中至少包含以下內(nèi)容:
typedef struct _iofunc_mount {
uint32_t flags;
uint32_t conf;
dev_t dev;
int32_t blocksize;
iofunc_funcs_t *funcs;
} iofunc_mount_t;
-
flags
涌矢,包含一個(gè)相關(guān)的位用于標(biāo)識(shí)資源管理器使用的偏移量是32-bit的(與擴(kuò)展的64-bit偏移相反)掖举; -
conf
,包含以下位:IOFUNC_PC_CHOWN_RESTRICTED/IOFUNC_PC_NO_TRUNC/IOFUNC_PC_SYNC_IO/IOFUNC_PC_LINK_DIR/IOFUNC_PC_ACL
蒿辙,這些選項(xiàng)是由iofunc
層_IO_PATHCONF
默認(rèn)處理程序返回的; -
dev
拇泛,包含文件系統(tǒng)對(duì)應(yīng)的設(shè)備號(hào),當(dāng)客戶端調(diào)用stat()
函數(shù)時(shí)思灌,會(huì)將該值填充到struct stat st_dev
成員中俺叭; -
blocksize
,包含了設(shè)備的塊大刑┏ァ熄守; -
funcs
,這是一個(gè)struct _iofunc_funcs
結(jié)構(gòu)耗跛,用于擴(kuò)展OCB裕照;