VFS四大對象之四-struct file

来源:http://www.cnblogs.com/linhaostudy/archive/2017/08/31/7459017.html
-Advertisement-
Play Games

繼上一篇文章: http://www.cnblogs.com/linhaostudy/p/7428971.html 四、file結構體 文件對象:註意文件對象描述的是進程已經打開的文件。因為一個文件可以被多個進程打開,所以一個文件可以存在多個文件對象。但是由於文件是唯一的,那麼inode就是唯一的, ...


繼上一篇文章:

http://www.cnblogs.com/linhaostudy/p/7428971.html

 

四、file結構體

文件對象:註意文件對象描述的是進程已經打開的文件。因為一個文件可以被多個進程打開,所以一個文件可以存在多個文件對象。但是由於文件是唯一的,那麼inode就是唯一的,目錄項也是定的!

進程其實是通過文件描述符來操作文件的,註意每個文件都有一個32位的數字來表示下一個讀寫的位元組位置,這個數字叫做文件位置。

565 struct file {
566         struct list_head        f_list;
567         struct dentry           *f_dentry;
568         struct vfsmount         *f_vfsmnt;
569         struct file_operations  *f_op;
570         atomic_t                f_count;
571         unsigned int            f_flags;
572         mode_t                  f_mode;
573         loff_t                  f_pos;
574         unsigned long           f_reada, f_ramax, f_raend, f_ralen, f_rawin;
575         struct fown_struct      f_owner;
576         unsigned int            f_uid, f_gid;
577         int                     f_error;
578 
579         size_t                  f_maxcount;
580         unsigned long           f_version;
581 
582         /* needed for tty driver, and maybe others */
583         void                    *private_data;
584 
585         /* preallocated helper kiobuf to speedup O_DIRECT */
586         struct kiobuf           *f_iobuf;
587         long                    f_iobuf_lock;
588 };

f_list:所有的打開的文件形成的鏈表!註意一個文件系統所有的打開的文件都通過這個鏈接到super_block中的s_files鏈表中!

f_dentry:與該文件相關的dentry

f_vfsmnt:該文件在這個文件系統中的安裝點

f_op:文件操作,當進程打開文件的時候,這個文件的關聯inode中的i_fop文件操作會初始化這個f_op欄位

f_count:引用計數

f_flags:打開文件時候指定的標識

f_mode:文件的訪問模式

f_pos:目前文件的相對開頭的偏移

unsigned long f_reada, f_ramax, f_raend, f_ralen, f_rawin:預讀標誌、要預讀的最多頁面數、上次預讀後的文件指針、預讀的位元組數以及預讀的頁面數

f_owner:記錄一個進程ID,以及當某些事發送的時候發送給該ID進程的信號

f_uid:用戶ID

f_gid:組ID

f_error:寫操作錯誤碼

f_version:版本號,當f_pos改變時候,version遞增

private_data:私有數據( 文件系統和驅動程式使用 )

 

 

重點解釋一些重要欄位

首先,f_flags、f_mode和f_pos代表的是這個進程當前操作這個文件的控制信息。這個非常重要,因為對於一個文件,可以被多個進程同時打開,那麼對於每個進程來說,操作這個文件是非同步的,所以這個三個欄位就很重要了。

第二:對於引用計數f_count,當我們關閉一個進程的某一個文件描述符時候,其實並不是真正的關閉文件,僅僅是將f_count減一,當f_count=0時候,才會真的去關閉它。對於dup,fork這些操作來說,都會使得f_count增加,具體的細節,以後再說。

第三:f_op也是很重要的!是涉及到所有的文件的操作結構體。例如:用戶使用read,最終都會調用file_operations中的讀操作,而file_operations結構體是對於不同的文件系統不一定相同。裡面一個重要的操作函數式release函數,當用戶執行close時候,其實在內核中是執行release函數,這個函數僅僅將f_count減一,這也就解釋了上面說的,用戶close一個文件其實是將f_count減一。只有引用計數減到0才關閉文件。

 

註意:對於“正在使用”和“未使用”的文件對象分別使用一個雙向鏈表進行管理。

 

註意上面的file只是對一個文件而言,對於一個進程(用戶)來說,可以同時處理多個文件,所以需要另一個結構來管理所有的files!

即:用戶打開文件表--->files_struct

172 struct files_struct {
173         atomic_t count;
174         rwlock_t file_lock;     /* Protects all the below members.  Nests inside tsk->alloc_lock */
175         int max_fds;
176         int max_fdset;
177         int next_fd;
178         struct file ** fd;      /* current fd array */
179         fd_set *close_on_exec;
180         fd_set *open_fds;
181         fd_set close_on_exec_init;
182         fd_set open_fds_init;
183         struct file * fd_array[NR_OPEN_DEFAULT];
184 };

 

 解釋一些欄位:

 

count:引用計數

file_lock:鎖,保護下麵的欄位

max_fds:當前文件對象的最大的數量

max_fdset:文件描述符最大數

next_fd:已分配的最大的文件描述符+1

fd:指向文件對象指針數組的指針,一般就是指向最後一個欄位fd_arrray,當文件數超過NR_OPEN_DEFAULT時候,就會重新分配一個數組,然後指向這個新的數組指針!

close_on_exec:執行exec()時候需要關閉的文件描述符

open_fds:指向打開的文件描述符的指針

close_on_exec_init:執行exec()時候需要關閉的文件描述符初始化值

open_fds_init:文件描述符初值集合

fd_array:文件對象指針的初始化數組

 

註意上面的file和files_struct記錄的是與進程相關的文件的信息,但是對於進程本身來說,自身的一些信息用什麼表示,這裡就涉及到fs_struct結構體。

  5 struct fs_struct {
  6         atomic_t count;
  7         rwlock_t lock;
  8         int umask;
  9         struct dentry * root, * pwd, * altroot;
 10         struct vfsmount * rootmnt, * pwdmnt, * altrootmnt;
 11 };

 

 解釋一些欄位:

 

count:引用計數

lock:保護鎖

umask:打開文件時候預設的文件訪問許可權

root:進程的根目錄

pwd:進程當前的執行目錄

altroot:用戶設置的替換根目錄

註意:實際運行時,這三個目錄不一定都在同一個文件系統中。例如,進程的根目錄通常是安裝於“/”節點上的ext文件系統,而當前工作目錄可能是安裝於/etc的一個文件系統,替換根目錄也可以不同文件系統中。

rootmnt,pwdmnt,altrootmnt:對應於上面三個的安裝點。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一:掛載 1) fdisk -l |grep sd 查看分區情況 或者fdisk -l 2) mkdir -p /data/disk1 創建數據存儲目錄 mkdir -p /data/disk2 mkdir -p /data/disk3 ...... 3) mkfs.xfs /dev/sdb 格式化 ...
  • 環境:ubuntu16.04 配置: CC=arm-linux-yourabi-gcc CFLAGS="-march=armv7-a -mfloat-abi=softfp -mfpu=neon-vfpv4 -mno-unaligned-access -fno-aggressive-loop-opti ...
  • 環境:ubuntu16.04 方法:通過socks5代理並且使用http鏈接 步驟: 1.設置全局使用socks5代理,並且使用http傳輸 git config --global http.proxy socks5://localhost:1080 (1080是設置的本地socks5埠,根據自己 ...
  • 我的無線網卡是博通的B43xx系列,大家都知道博通對於其Wifi卡在 GNU/Linux 上的支持不好可謂是臭名昭著。 查看了下網路介面,發現沒有無線網路的介面,於是就想應該是沒驅動支持 (註:關於ip和ifconfig請看這篇文章: https://linux.cn/article-4326-1. ...
  • 1.部署步驟 1.1.啟動安裝程式 在啟動頁面上選擇Installation,然後按Enter鍵,這將載入SUSE Linux伺服器安裝程式並以普通模式安裝。 1.2.選擇安裝語言 Language和KeyboardLayout都選擇為English(US),並勾選I Agree to the Li ...
  • 一、問題 今天在windows7系統下安裝virtualbox報錯:VirtualBox COM獲取對象失敗,應用程式將被中斷。上網查了下,發現瞭解決辦法。 環境:windows7、VirtualBox 5.1.26、CentOS-6.7-x86_64-bin-DVD1。 二、解決 修改註冊表兩個值 ...
  • 分析過程 windows下的Notepad記事本軟體在另存的時候可以選擇保存的編碼方式。 我們可以在記事本中輸入同樣的文本,如“a嚴”。 ANSI方式我們用UtralEdit查看二進位信息可以看到: 這裡 對應的ANSI編碼為 , 對應的ANSI編碼為 。 Unicode BE編碼下的二進位信息: ...
  • 1、Linux下目錄複製:本機->遠程伺服器 2、Linux下目錄複製:遠程伺服器->本機 3、Linux下文件複製:遠程伺服器->本機 -a 儘可能將檔案狀態、許可權等資料都照原狀予以複製。 -r 若 source 中含有目錄名,則將目錄下之檔案亦皆依序拷貝至目的地。 -f 若目的地已經有相同檔名的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...