首頁  >  文章  >  系統教程  >  探索 Linux 系統中的文件類型:普通文件、目錄與特殊文件

探索 Linux 系統中的文件類型:普通文件、目錄與特殊文件

王林
王林原創
2024-06-27 10:58:25725瀏覽

探索 Linux 系统中的文件类型:普通文件、目录与特殊文件

後面幾節討論了在linux中進行C語言開發時linux系統有幾種文件類型,執行I/O的基本函數。不過在舉例做實驗的過程中linux系統有幾種文件類型,都是圍繞著普通文件進行的。

linux系统有几种文件类型_linux典型文件系统类型_linux特有的文件系统

linux中的文件類型

還記得在第9節,我們談到unix系統(linux是類unix系統)覺得「一切皆檔案」嗎? unix系統中大多數檔案是普通檔案和目錄,這兩種類型的檔案也是最常使用的,例如/usr目錄和它上面的hello.txt文字檔案就屬於普通檔案類型。

事實上linux site:infoq.cn,linux系統將所有檔案分為以下幾大類:

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

取得linux中的文件類型

linux提供了stat系列函數取得檔案的統計資料。在linux中輸入manstat,即可得到stat函數的使用指南:

linux系统有几种文件类型_linux典型文件系统类型_linux特有的文件系统

linux系统有几种文件类型_linux特有的文件系统_linux典型文件系统类型

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

 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系统有几种文件类型_linux典型文件系统类型

linux典型文件系统类型_linux系统有几种文件类型_linux特有的文件系统

可以看出,統計函數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系统有几种文件类型_linux典型文件系统类型

C語言實例,取得linux檔案類型

linux典型文件系统类型_linux系统有几种文件类型_linux特有的文件系统

晓得了stat函数和以上几个宏,编撰C语言程序获取文件的类型是便捷的:

#include 
#include 
#include 
#include 
int main(int argc, char* argv[])
{
 if(argc < 2){
 printf("ntusage:");
 printf("ntt%s filepathn", 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 : %sn", argv[1], res);
 return 0;
}

以上代码使用了lstat函数,而不是stat函数,它俩的功能是相同的。惟一不同之处在于处理符号链接时,lstat是将该符号链接直接作为文件处理的,而stat函数则是处理该符号链接指向的文件。

linux特有的文件系统_linux系统有几种文件类型_linux典型文件系统类型

编译以上代码,执行之:

# 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特有的文件系统_linux系统有几种文件类型

程序接收一个参数,并返回该参数的类型。其他几种类型文件的测试留给读者,在这一过程中可以顺便了解一下linux中的文件组成。

欢迎在评论区一起讨论linux文本编辑器,指责。文章都是手打原创,每晚最扼要的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以见到最新更新和之前的文章哦。

以上是探索 Linux 系統中的文件類型:普通文件、目錄與特殊文件的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn