4.18 mkfifo
檔案:mkfifo.c
處理:這個函式試圖在檔案系統下的建立乙個先進先出節點。該函式基於~mknod()~函式。
開發注釋:見~mknod()~函式的開發注釋。
4.19 mknod
檔案:mknod.c
處理:此函式允許在檔案系統下建立以下型別的節點:
截至目前,試圖建立乙個~fifo~會使呼叫函式得到乙個~enotsup~的錯誤。
此例程基於檔案系統的特定函式~evalformake()~函式和~mknod()~函式。
乙個新檔案系統必須包含自己的~evalformake()~和~mknod()~函式,以支援通用的~mknod()~函式。
在此條件下的通用~mknod()~函式支援其他檔案系統型別而不必進行任何修改。
開發注釋:
測試節點的型別,測試過程類似以下的**:
if ( (mode & s_ifdir) = = s_ifdir) ||
(mode & s_ifreg) = = s_ifreg) ||
(mode & s_ifchr) = = s_ifchr) ||
(mode & s_ifblk) = = s_ifblk) ||
(mode & s_ififo) = = s_ififo))
set_errno_and_return_minus_one (einval);
其中:
使用~rtems_filesystem_get_start_loc()~函式判斷即將建立的路徑名稱是從根目錄開始或相對於當前目錄開始的。
確定路徑名稱在節點建立後是否是乙個有效的可被訪問的目錄。
如果路徑名是乙個可建立節點的有效位置,驗證該檔案系統是否提供了~mknod()~函式。
如果~mknod()~函式存在,呼叫該檔案系統的~mknod()~函式,並傳遞名稱、模式、裝置型別和節點建立的目錄位置資訊給該函式。
4.20 mount
檔案:mount.c
引數(不是乙個標準的~posix~呼叫):
rtems_filesystem_mount_table_entry_t **mt_entry,
如果掛載操作成功,這個指向指標的指標將被設定為指向已為這個檔案系統掛載分配的掛載表專案。
rtems_filesystem_operations_table *fs_ops,
這個指標指向我們即將掛載的檔案系統的函式表。
這個機制選擇檔案系統型別時不需要為了正確的完成掛載操作而儲存乙個所有可能檔案系統型別的動態資料庫。
使用這種方法,只需要配置我們希望在~rtems~執行體中使用到的檔案系統。
未使用的檔案系統型別將不會被編譯。
char *fsoptions,
此引數指向乙個選擇掛載為唯讀訪問或讀/寫訪問的字串。有效的字串是~"ro"~和~"rw"。
char *device,
此引數是保留給乙個裝置的名稱,用來訪問檔案系統資訊。
當前檔案系統的實現是基於記憶體的,不需要裝置來訪問檔案系統資訊。
char *mount_point
這是乙個已經掛載檔案系統上的允許讀取、寫和執行的目錄的路徑名。
如果成功,通過評估這個名字發現這個節點儲存在~mt_entry。
處理:此函式將掛載乙個檔案系統到掛載點上。
如果操作成功,返回乙個指向與已掛載檔案系統相關的掛載鍊錶中的專案的指標給呼叫函式。
關於掛載點的處理和被掛載檔案系統的處理都被封裝在檔案系統裡的~mount()~和~fsmount_me()~函式中。
這使得通用~mount()~函式保持不變,即可支援新的檔案系統型別。
開發注釋:
此函式將使用~get_file_system_options()~來判斷掛載選項~("ro"~或~"rw")~是否正確。
它確認檔案系統的~ops~表已經被選中。
為掛載表條目分配空間並初始化臨時掛載表的相關字段。
如果指定乙個掛載點:將檢查掛載點,以確定它是乙個目錄並且也有適當的許可權允許檔案系統掛載到這個目錄上。
在當前的掛載鍊錶中搜尋,以確定沒有其他的檔案系統掛載在我們試圖進行掛載的掛載點上。
如果在包含掛載點的檔案系統的~ops~表中定義了~mount~函式,那麼在這個時候將呼叫他。
如果沒有指定掛載點:按掛載鍊錶專案建立基本檔案系統。
如果~fsmount_me()~函式在被掛載檔案系統的~ops~表中指定了,即呼叫函式來初始化新的檔案系統。
在成功完成後,記錄了掛載檔案系統的臨時掛載表項將放到掛載錶鏈上。
4.21 open
檔案:open.c
處理:此函式是建立在~rtems~呼叫和檔案系統的自己實現的~open()~函式。
這些功能的介面應該不會為新檔案系統而改變,因此在引入新檔案系統進入系統中**是穩定的。
開發注釋:這個函式為即將開啟的乙個檔案或裝置分配檔案控制塊。
然後它將測試路徑是否存在。如果存在將填充乙個~rtems_filesystem_location_info_t~結構的資料。
此結構包含的資訊與節點的資訊、檔案系統特定的函式和該路徑的掛載鍊錶的資訊相關。
如果指定了建立選項,它嘗試著在指定的路徑下建立乙個普通檔案的節點。
如果該檔案已經在指定的路徑下存在,將會產生乙個錯誤,否則,在包含該路徑的檔案系統下將為該檔案分配乙個節點。
當建立了乙個新的節點時,也會對其進行評估,以便為新建立節點的~rems_filesystem_location_info_t~資料結構內填充合適的資訊。
如果檔案已存在或已被成功建立,將使用詳細描述節點和檔案系統資料的處理程式表資訊,節點資訊和
~rtems_filesystem_location_info_t~資料結構初始化該檔案控制塊結構。
如果~open()~函式存在與節點所在檔案系統的處理程式表中,我們
試圖進行開啟操作,將在這時呼叫它。
如果在過程中發現有任何錯誤,執行清理操作。它包括釋放檔案
控制塊結構,是在通用~open()~函式開始時分配的。
一旦~open()~成功,計算檔案描述符表的索引並將其返回給呼叫程式。
4.22 opendir
檔案:opendir.c
處理:這個函式嘗試開啟乙個目錄進行讀訪問。
這將建立乙個目錄控制結構用來訪問目錄資訊。
此函式基於通用的~open()~函式和檔案系統特定的目錄處理函式。
開發注釋:
bsd~小組提供這個函式。
4.23 pathconf
檔案:pathconf.c
處理:這個函式將獲取乙個路徑配置引數並返回給呼叫程式。
它基於通用的~open()~函式和~fpathconf()~函式。
增加新檔案系統型別到系統中不會改變這些介面。
開發注釋:
這個函式將按照路徑嘗試開啟該檔案。
如果成功,pathconf~使用~fpathconf()~函式並指定名稱訪問該檔案的檔案描述符中的值。
訪問完成後關閉該檔案。
4.24read
檔案:deviceio.c
處理:此函式基於一系列~rtems~的呼叫和檔案系統自己的讀取操作。
該功能基於這樣的實現方式,使它們在引入新的檔案系統時可以免於修改。
開發注釋:
這個函式將檢查它傳送的檔案描述符的型別。
如果這個檔案描述符與網路裝置相關聯,讀取函式將被對映乙個特別的網路處理處理程式。
從網路處理程式返回的**作為通用~read()~函式的返回**被返回。
對於與該檔案系統相關聯的檔案描述符將順序執行下列操作:
獲取檔案控制塊相關聯的檔案描述符;
檢查檔案描述符的範圍;
確定緩衝區的指標是有效的;
檢查計數不為零;
檢查檔案控制塊確定我們是否有讀取許可權;
如果在處理程式表中有~read()~函式,呼叫處理程式表中的~read()~函式;
使用從處理程式表中的~read()~函式的返回值(讀取的位元組數)加入檔案控制塊中的偏移量字段;
返回讀取的位元組數給呼叫程式。
4.25 readdir
檔案:readdir.c
處理:這個函式從~bsd~小組獲得。沒有對原來的**做任何的修改。
開發注釋:
該函式呼叫乙個由使用者提供的~getdents()~函式。這個函式提供檔案系統讀取目錄的特殊資訊。
它基於目錄處理程式表中的~read()~函式。此函式已被對映到~imfs_dir_read()~函式。
4.26 unmount
檔案:unmount.c
處理:這個例程將嘗試掛載的檔案系統卸除,然後釋放所有資源
被分配給該檔案系統的管理。
開發注釋:
這個程式將確定是否有已掛載的檔案系統掛載在我們正在試圖解除安裝的檔案系統上。這將防止解除安裝檔案系統;
它將測試當前目錄是否在我們正在試圖解除安裝的檔案系統中。這將防止解除安裝檔案系統;
它會掃瞄所有當前開啟的檔案描述符,以確定是否有是乙個已開啟的檔案描述符在我們正試圖~unmount()~的檔案系統中。
如果上述條件得到滿足,然後按以下順序執行:
呼叫包含該掛載點的檔案系統的~unmount()~函式。這個函式應指示掛載點下面沒有掛載檔案系統;
為我們試圖解除安裝的檔案系統呼叫它的~fsunmount_me()~函式,
這個函式應該清理被解除安裝檔案系統的管理過程中一些不再需要的資源;
移除掛載表中的剛剛從掛載鍊錶中解除安裝的檔案系統;
釋放與移除的掛載表項相關聯的記憶體。
RTEMS檔案系統 5 檔案系統實現需求 上
5 filesystem implementation requirements 本章詳細描述所有檔案系統的實現都必須堅持的要求。5.1 general rtems 檔案系統框架的用意是與 posix 檔案和目錄介面標準相相容。下面檔案系統的特性導致了功能交換層。向應用程式提供與 posix 標準相...
linux檔案系統系統呼叫 fallocate
int fallocate int fd,int mode,off t offset,off t len 為檔案預分配物理空間。include 成功返回0,失敗返回 1。fd檔案描述符 mode 目前兩種mode 1.falloc fl keep size 從offset開始分配大小為len的空間,...
檔案系統 read系統呼叫剖析(一)
一 read系統呼叫剖析 1,kernel層的read系統呼叫的入口函式是在kernel fs read write.c檔案中,如下所示 372 syscall define3 read,unsigned int,fd,char user buf,size t,count 373 386 retur...