首页
/
每日頭條
/
科技
/
linux中常用的文件系統類型
linux中常用的文件系統類型
更新时间:2025-06-26 19:12:35

前面幾節讨論了在 linux 中進行 C語言開發時,執行 I/O 的基本函數。不過在舉例做實驗的過程中,都是圍繞普通文件進行的。

linux中常用的文件系統類型(三分鐘徹底了解linux操作系統中的文件類型)1

linux 中的文件類型

還記得在第9節,我們提到 unix 系統(linux是類unix系統)認為“一切皆文件”嗎?unix 系統中大多數文件是普通文件和目錄,這兩種類型的文件也是最常使用的,比如 /usr 目錄和它裡面的 hello.txt 文本文件就屬于普通文件類型。

事實上,linux 系統将所有文件分為以下幾大類:

  • 普通文件。
  • 目錄文件。
  • 塊特殊文件。這種類型的文件以磁盤為典型代表,linux 内核一般提供帶緩沖的讀寫,以磁盤為例,每次讀寫一般都是固定長度的數據(一個扇區的數據),而且内核往往不是立刻将數據寫到磁盤,而是在之後cpu較為空閑時寫入。
  • 字符特殊文件。以終端為例,處理這種文件時,内核不需要提供緩沖讀寫,例如程序輸出字符到串口,通常希望越快響應越好。
  • FIFO。這種類型的文件一般用于多進程間通信。
  • 套接字。這種類型的文件用于進程間的網絡通信。
  • 符号鍊接。這種類型的文件類似于 windows 中的快捷方式。

這麼看來,linux 系統中的設備(如硬盤,串口等)要麼是塊特殊文件,要麼就是字符特殊文件了。

獲取 linux 中的文件類型

linux 提供了 stat 系列函數獲取文件的統計信息。在 linux 中輸入 man stat,即可得到 stat 函數的使用手冊:

linux中常用的文件系統類型(三分鐘徹底了解linux操作系統中的文件類型)2

stat 函數的第二個參數是一個結構體,它的定義可以在 <sys/stat.h> 中找到:

struct stat { unsigned long st_dev; unsigned long st_ino; unsigned short st_mode; unsigned short st_nlink; unsigned short st_uid; unsigned short st_gid; unsigned long st_rdev; unsigned long st_size; unsigned long st_blksize; unsigned long st_blocks; unsigned long st_atime; unsigned long st_atime_nsec; unsigned long st_mtime; unsigned long st_mtime_nsec; unsigned long st_ctime; unsigned long st_ctime_nsec; unsigned long __unused4; unsigned long __unused5; };

linux中常用的文件系統類型(三分鐘徹底了解linux操作系統中的文件類型)3

可以看出,統計函數 stat 能夠獲得文件的各種信息,例如用戶組ID,用戶ID,以及文件的 size 等信息。其中 st_mode 成員記錄着文件的類型以及mode(權限)。使用下面這幾個宏即可獲得文件的類型:

... #define S_ISDIR(mode) __S_ISTYPE((mode), __S_IFDIR) #define S_ISCHR(mode) __S_ISTYPE((mode), __S_IFCHR) #define S_ISBLK(mode) __S_ISTYPE((mode), __S_IFBLK) #define S_ISREG(mode) __S_ISTYPE((mode), __S_IFREG) #ifdef __S_IFIFO # define S_ISFIFO(mode) __S_ISTYPE((mode), __S_IFIFO) #endif #ifdef __S_IFLNK # define S_ISLNK(mode) __S_ISTYPE((mode), __S_IFLNK) #endif ...

linux中常用的文件系統類型(三分鐘徹底了解linux操作系統中的文件類型)4

C語言實例,獲取 linux 文件類型

知道了 stat 函數和以上幾個宏,編寫 C語言程序獲取文件的類型是方便的:

#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> int main(int argc, char* argv[]) { if(argc < 2){ printf("\n\tusage:"); printf("\n\t\t%s filepath\n", argv[0]); return -1; } struct stat tmp; char* res; lstat(argv[1], &tmp); if(S_ISREG(tmp.st_mode)) res = "regular"; else if(S_ISDIR(tmp.st_mode)) res = "directory"; else if(S_ISBLK(tmp.st_mode)) res = "block"; else if(S_ISLNK(tmp.st_mode)) res = "link"; else if(S_ISFIFO(tmp.st_mode)) res = "fifo"; else if(S_ISSOCK(tmp.st_mode)) res = "socket"; else res = "unknown"; printf("%s : %s\n", argv[1], res); return 0; }

以上代碼使用了 lstat 函數,而不是 stat 函數,它倆的功能是相同的。唯一不同之處在于處理符号鍊接時,lstat 是将該符号鍊接直接作為文件處理的,而 stat 函數則是處理該符号鍊接指向的文件。

linux中常用的文件系統類型(三分鐘徹底了解linux操作系統中的文件類型)5

編譯以上代碼,執行之:

# gcc t6.c # ./a.out usage: ./a.out filepath # ./a.out ../ ../ : directory # ./a.out t.c t.c : regular root@lcc:/lccRoot/C/tmp# ./a.out ../ ../ : directory # ./a.out /dev/log /dev/log : socket #

linux中常用的文件系統類型(三分鐘徹底了解linux操作系統中的文件類型)6

程序接收一個參數,并返回該參數的類型。其他幾種類型文件的測試留給讀者,在這一過程中可以順便了解一下 linux 中的文件組成。

歡迎在評論區一起讨論,質疑。文章都是手打原創,每天最淺顯的介紹C語言、linux等嵌入式開發,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
OP0P手機質量怎麼樣
OP0P手機質量怎麼樣
,
2025-06-26
沉浸式體驗視覺震撼科技感爆棚
沉浸式體驗視覺震撼科技感爆棚
在萬物互聯時代“屏”在人們的生活中扮演着越來越重要的角色在我們的生活當中你是否見到過一些重大活動的顯示屏又是否看到過地标性的顯示屏?手機屏幕、電視、電腦……這些生活中常見的東西都與LED技術息息相關這塊屏幕既是連接智能虛拟世界的第一界面也是...
2025-06-26
學生的畫畫日記
學生的畫畫日記
上個星期,老師跟我們講,學校有科技繪畫比賽,喜歡畫畫的同學可以參加。我一聽老師的宣布,毫不猶豫地踴躍參加了。自從報了名之後,我每天就上網查圖片,一放學回來就開始畫畫,勾邊,上顔色。足足忙了一個星期,我的科技繪畫還沒有畫完,心情由剛開始的自信...
2025-06-26
卡牌手遊收入排行榜2022
卡牌手遊收入排行榜2022
點擊分享本文:近日,當樂遊戲中心發布了15年5月手遊數據,5月首發新遊量共計35款,相較于4月有所減少,其中,卡牌類産品占比為37%,角色扮演類産品占比35%,兩者僅相差2%,這樣的差距若是在2013-2014年的卡牌遊戲爆紅期,是根本無法...
2025-06-26
筆記本屏幕技術指标
筆記本屏幕技術指标
2015-03-1205:20:00作者:尹航短短兩年多時間裡,筆記本顯示屏素質獲得有目共睹的全面提升。從1366×768到1920×1080甚至到3K、4K,從滿大街的TN屏,到如今的IPS、IGZO2、PLS百花齊放,視覺革命所帶來的最...
2025-06-26
Copyright 2023-2025 - www.tftnews.com All Rights Reserved