Chapter 4 :POSIX-Layer Data Structures
資源管理器庫定義了(在<sys / iofunc.h>中)與POSIX層支持例程相關的幾個關鍵結構:
iofunc_ocb_t (Open Control Block) structure
包含每個打開的數據,例如當前位置到文件中(lseek()偏移量)。
iofunc_attr_t (attribute) structure
由於資源管理器可能負責多個設備(例如,devc-ser*可能負責/dev/ser1,/dev/ser2,/dev/ser3等),因此屬性結構將數據保存在per-name 基礎。該結構包含諸如設備所有者的用戶和組ID,最後修改時間等項目。
iofunc_mount_t (mount) structure
包含對整個mount device而言是全局的per-mountpoint數據項。文件系統(塊I/O設備)管理器使用此結構;設備的資源管理器通常不具有mount結構。
這張照片可能有助於解釋它們之間的相互關係:
如果三個客戶端打開與資源管理器關聯的兩個路徑,則數據結構鏈接如下:
The iofunc_ocb_t (Open Control Block) structure
開放控制塊(OCB)維護涉及客戶端和資源管理器的特定會話的狀態信息。它是在open()處理期間創建的,並且一直存在直到執行close()。
iofunc層輔助函數使用此結構。(在擴展POSIX層數據結構一章中,我們將向您展示如何擴展它以包含您自己的數據)。
OCB結構至少包含以下內容:
typedef struct _iofunc_ocb { IOFUNC_ATTR_T *attr; int32_t ioflag; off_t offset; uint16_t sflag; uint16_t flags; } iofunc_ocb_t; |
值代表的地方:
attr
指向屬性結構的指針(見下文)。
ioflag
包含打開資源的模式(例如,讀取,寫入,阻止)。 此信息繼承自傳遞給io_open處理程序的消息中可用的io_connect_t結構。打開模式(傳遞給客戶端的open())將轉換爲ioflag值,如下所示:
Offset
資源的read/write偏移量(例如,我們在文件中的當前lseek()位置)。您的資源管理器可以修改此成員。
sflag
定義共享模式。此信息繼承自傳遞給io_open處理程序的消息中可用的io_connect_t結構。
flags
以下位中的零個或多個的組合:
-
IOFUNC_OCB_PRIVILEGED - 執行open()的特權進程(即root)
-
IOFUNC_OCB_MMAP - 客戶端的mmap()調用正在使用此OCB
-
IOFUNC_OCB_MMAP_UNIQUE - mmap()處理程序的提示,以提供唯一的映射
此外,您可以在IOFUNC_OCB_FLAGS_PRIVATE定義的範圍內使用標誌(請參閱<sys/iofunc.h>)以用於您自己的目的。您的資源管理器可以修改這些標誌。
The iofunc_attr_t (attribute) structure
iofunc_attr_t結構定義了您爲其提供資源管理器的設備的特徵。這與OCB結構一起使用。
屬性結構至少包含以下內容:
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; unsigned mtime_ns; unsigned atime_ns; unsigned ctime_ns; } iofunc_attr_t; |
這些領域包括:
-
mount
指向安裝結構的指針(見下文)。 -
flags
位映射標誌成員可以包含以下標誌:
IOFUNC_ATTR_ATIME
訪問時間不再有效。通常設置爲從資源讀取。
IOFUNC_ATTR_CTIME
狀態時間的更改不再有效。通常設置文件信息更改。
IOFUNC_ATTR_DIRTY_NLINK
鏈接數已更改。
IOFUNC_ATTR_DIRTY_MODE
模式已經改變。
IOFUNC_ATTR_DIRTY_OWNER
uid或gid已經改變了。
IOFUNC_ATTR_DIRTY_RDEV
rdev成員已更改,例如mknod()。
IOFUNC_ATTR_DIRTY_SIZE
尺寸發生了變化。
IOFUNC_ATTR_DIRTY_TIME
mtime,atime或ctime中的一個或多個已更改。
IOFUNC_ATTR_MTIME
修改時間不再有效。通常設置對資源的寫入。
IOFUNC_ATTR_NS_TIMESTAMPS
(QNX Neutrino 7.0或更高版本)屬性結構包括用於納秒分辨率時間戳的字段,mtime_ns,atime_ns和ctime_ns。
由於資源管理器使用這些標誌,您可以立即告知屬性結構的哪些字段已被各種iofunc層輔助例程修改。這樣,如果您需要將條目寫入某些介質,您可以只編寫已更改的條目。用戶定義的標誌區域是IOFUNC_ATTR_PRIVATE(參見<sys/iofunc.h>)。
有關更新屬性結構的詳細信息,請參閱“Handling Read and Write Messages”一章中的“Updating the time for reads and writes”一節。
-
lock_tid和lock_count
要在資源管理器中支持多個線程,您需要鎖定屬性結構,以便一次只允許一個線程更改它。在調用某些處理函數(即IO_ *)時,資源管理器層會自動鎖定屬性(使用iofunc_attr_lock())。
lock_tid成員保存線程ID;lock_count成員保存線程鎖定屬性結構的次數。有關更多信息,請參閱QNX Neutrino C庫參考中的iofunc_attr_lock()和iofunc_attr_unlock()函數。)
-
count, rcount,wcount,rlocks 和wlocks
幾個計數器存儲在屬性結構中,並由一些iofunc層輔助函數遞增/遞減。從客戶端收到的消息的功能和實際內容都決定了哪些特定成員受到影響。
這些計數並不是唯一的。例如,如果OCB指定打開資源進行讀寫,則count,rcount和wcount都會遞增。(請參閱iofunc_attr_init(),iofunc_lock_default(),iofunc_lock(),iofunc_ocb_attach()和iofunc_ocb_detach()函數。)
-
mmap_list和lock_list
爲了管理它們在資源上的特定功能,mof_list成員由iofunc_mmap()和iofunc_mmap_default()函數使用;lock_list成員由iofunc_lock_default()函數使用。通常,您不需要修改或檢查這些成員。
-
List
保留供將來使用。
-
list_size
保留列表區域的大小;留作將來使用。
-
nbytes
資源中的字節數。您的資源管理器可以修改此成員。對於文件,這將包含文件的大小。對於不支持lseek()或對lseek()具有根本不同解釋的特殊設備(例如/ dev / null),不使用此字段(因爲您不會使用任何輔助函數,但是而是提供你自己的。)在這些情況下,我們建議你將這個字段設置爲零,除非你有一個有意義的解釋,你要放在它上面。
-
inode
這是一個特定於安裝點的inode,每個mountpoint必須是唯一的。您可以指定自己的值,或者0以讓進程管理器爲您填寫。對於文件系統資源管理器,這可能對應於某些磁盤上的結構。無論如何,這個領域的解釋取決於你。
-
uid和gid
此資源所有者的用戶標識和組標識。這些字段由chown()輔助函數(例如,iofunc_chown_default())自動更新,並且與open()幫助函數(例如,iofunc_open_default())一起用於訪問授權目的的模式成員引用。
-
mtime,atime和ctime
三個POSIX時間成員:
-
mtime - 修改時間(write()更新此)
-
atime - 訪問時間(read()更新此)
-
ctime - 更改狀態時間(write(),chmod()和chown()更新此)
由於調用iofunc層功能,一個或多個時間成員可能無效。這是爲了避免讓每個I/O消息處理程序進入內核並請求當前時間,只是爲了填寫屬性結構的時間成員。
POSIX聲明這些時間在執行fstat()時必須有效,但它們不必反映相關更改發生的實際時間。此外,如果在fstat()調用之間發生關聯的更改,則時間必須在fstat()調用之間更改。如果在fstat()調用之間從未發生相關更改,則返回的時間應與上次返回的時間相同。此外,如果關聯的更改在fstat()調用之間多次發生,則時間只需要與先前返回的時間不同。
有一個輔助功能,可以給成員填充正確的時間;您可能希望在適當的處理程序中調用它以使設備上的時間保持最新 - 請參閱iofunc_time_update()函數。
-
mode
包含資源的模式(例如,類型,權限)。可以從<sys/stat.h>中的S_*系列常量中選擇有效模式;請參閱struct stat。
-
nlink
此特定名稱的鏈接數。對於表示目錄的名稱,此值必須至少爲2(一個用於目錄本身,一個用於其中的./條目)。您的資源管理器可以修改此成員。
-
RDEV
包含字符特殊設備的設備編號和命名特殊設備的rdev編號。
-
mtime_ns,atime_ns和ctime_ns
(QNX Neutrino 7.0或更高版本)POSIX時間成員的納秒值,mtime,atime和ctime。
如果編譯爲64位體系結構,或者在編譯32位體系結構時包含<sys/iofunc.h>之前定義IOFUNC_NS_TIMESTAMP_SUPPORT,則包括這些字段。
The optional iofunc_mount_t (mount) structure
mount結構的成員,特別是conf和flags成員,修改了一些iofunc層函數的行爲。
如果需要修改安裝結構的任何成員,請使用iofunc_mount_init()對其進行初始化。
例如,您的程序將文件保存到文件系統。您可以使用iofunc_mount_init()和iofunc_mount_set_time()爲與文件系統使用的分辨率匹配的打開文件設置時間戳分辨率(POSIX要求)。
iofunc_mount_t結構是可選的,至少包含以下內容:
typedef struct _iofunc_mount { uint32_t flags; uint32_t conf; dev_t dev; int32_t blocksize; iofunc_funcs_t *funcs; void *power;
size_t size; uint32_t ex_flags; uint32_t timeres; uint64_t reserved[4]; } iofunc_mount_t; |
變量是:
-
flags
包含一個相關位(清單常量IOFUNC_MOUNT_32BIT),表示此資源管理器使用的偏移量爲32位(與擴展的64位偏移量相反)。用戶可修改的掛載標誌定義爲IOFUNC_MOUNT_FLAGS_PRIVATE(參見<sys/iofunc.h>)。
-
conf
包含幾個位:
IOFUNC_PC_CHOWN_RESTRICTED
導致_IO_CHOWN消息的默認處理程序以POSIX定義的方式表現爲“chown-restricted”。
IOFUNC_PC_NO_TRUNC
對iofunc層庫沒有影響,但是由iofunc層的默認_IO_PATHCONF處理程序返回。
IOFUNC_PC_SYNC_IO
表示文件系統支持同步I/O操作。如果未設置此位,可能會發生以下情況:O_DSYNC, O_RSYNC, or O_SYNC
IOFUNC_PC_LINK_DIR
控制是否允許root鏈接和取消鏈接目錄。
IOFUNC_PC_ACL
指示資源管理器是否支持訪問控制列表。有關ACL的更多信息,請參閱QNX Neutrino程序員指南中的使用訪問控制列表(ACL)。
IOFUNC_PC_EXT
調用iofunc_mount_init()時自動設置以設置iofunc_mount_t結構。
請注意,上面提到的conf成員選項由iofunc層_IO_PATHCONF默認處理程序返回。
-
dev
包含文件系統的設備編號。此數字將返回到struct stat st_dev成員中的客戶端stat()函數。
-
blocksize
包含設備的塊大小。在資源管理器的文件系統類型上,這指示磁盤的本機塊大小,例如512字節。
-
funcs
包含以下結構:
struct _iofunc_funcs { unsigned nfuncs; IOFUNC_OCB_T *(*ocb_calloc) (resmgr_context_t *ctp, IOFUNC_ATTR_T *attr); void (*ocb_free) (IOFUNC_OCB_T *ocb); int (*attr_lock)(IOFUNC_ATTR_T *attr); int (*attr_unlock)(IOFUNC_ATTR_T *attr); int (*attr_trylock)(IOFUNC_ATTR_T *attr); }; |
哪裏:
-
nfuncs
表示結構中存在的函數數量;你應該用清單常量_IOFUNC_NFUNCS填充它。
-
ocb_calloc()和ocb_free()
允許您基於每個掛載點覆蓋OCB(請參閱“Extending the POSIX-Layer Data Structures”一章中的“Extending the OCB and attribute structures”)。如果這些成員爲NULL,則使用默認庫版本(iofunc_ocb_calloc()和iofunc_ocb_free())。您必須指定這兩個函數中的兩個或兩個;它們作爲匹配對運行。 -
attr_lock(),attr_unlock()和attr_trylock()
允許您創建鎖定,解鎖和嘗試鎖定屬性結構的功能的自定義版本。
-
power
保留供將來使用。
-
size
包含iofunc_mount_t函數的大小。由iofunc_mount_init()設置。
-
ext_flags
擴展可能的標誌值範圍。
-
timers
包含iofunc函數和結構的時間戳分辨率。由iofunc_mount_set_time()設置。
-
reserved
保留供將來使用。