嵌入式Linux:Linux系統(tǒng)中文件類型
在Windows系統(tǒng)中,操作系統(tǒng)通常通過(guò)文件名后綴來(lái)識(shí)別文件類型。例如,C語(yǔ)言頭文件使用“.h”后綴,C語(yǔ)言源文件使用“.c”后綴,文本文件使用“.txt”后綴,壓縮包文件使用“.zip”后綴。打開文件時(shí),Windows會(huì)根據(jù)文件名后綴確定文件類型,然后調(diào)用相應(yīng)的程序打開它。例如,打開“.c”文件時(shí)會(huì)使用C代碼編輯器,打開“.zip”文件時(shí)會(huì)使用解壓軟件。
然而,在Linux系統(tǒng)中,文件類型并不是通過(guò)文件后綴名來(lái)識(shí)別的。這并不意味著文件名后綴可以隨意添加。文件名和后綴主要是為了方便“人”查看和識(shí)別。盡管Linux系統(tǒng)不依賴后綴來(lái)識(shí)別文件,但規(guī)范地使用后綴仍然很重要。例如,C源文件應(yīng)以“.c”結(jié)尾,C頭文件應(yīng)以“.h”結(jié)尾,Shell腳本文件應(yīng)以“.sh”結(jié)尾。這是為了方便我們自己查看和管理文件。
在Linux系統(tǒng)中,共有七種文件類型:
普通文件;
目錄文件;
字符設(shè)備文件;
塊設(shè)備文件;
符號(hào)鏈接文件;
套接字文件;
管道文件。
1
普通文件
普通文件(regular file)是Linux系統(tǒng)中最常見的文件類型,如文本文件、二進(jìn)制文件以及我們編寫的源代碼文件等。普通文件中的數(shù)據(jù)存儲(chǔ)在系統(tǒng)磁盤中,可以訪問(wèn)和讀取這些文件中的內(nèi)容,文件內(nèi)容以字節(jié)為單位進(jìn)行存儲(chǔ)和訪問(wèn)。
普通文件可以分為兩大類:文本文件和二進(jìn)制文件。
文本文件:文本文件的內(nèi)容由ASCII碼字符構(gòu)成。雖然文件本質(zhì)上都是數(shù)字(因?yàn)橛?jì)算機(jī)只識(shí)別0和1,磁盤上的文件內(nèi)容也是由0和1構(gòu)成),但文本文件中的數(shù)字應(yīng)該被理解為對(duì)應(yīng)的ASCII字符碼。例如,常見的.c、.h、.sh、.txt文件都是文本文件。文本文件的優(yōu)點(diǎn)是方便人類閱讀、瀏覽和編寫。
示例:
cat example.txt
二進(jìn)制文件:二進(jìn)制文件中存儲(chǔ)的也是數(shù)字,但這些數(shù)字不是文本字符編碼,而是真正的數(shù)值。例如,Linux系統(tǒng)下的可執(zhí)行文件、C代碼編譯后的.o文件、.bin文件等都是二進(jìn)制文件。
示例:
hexdump -C example.bin
2
目錄文件
目錄文件(directory file)是用于組織和管理其他文件和子目錄的特殊文件。目錄文件包含指向其他文件和目錄的列表,使得文件系統(tǒng)具有層次結(jié)構(gòu)。目錄文件的主要作用是提供一種方式來(lái)組織文件系統(tǒng)中的數(shù)據(jù),使得文件和目錄可以以一種樹狀結(jié)構(gòu)進(jìn)行管理。
3
字符設(shè)備文件
字符設(shè)備文件(Character Device File)是一種特殊的文件類型,用于與字符設(shè)備進(jìn)行直接的字符流通信。字符設(shè)備通常是那些可以一次一個(gè)字符地讀寫的設(shè)備,如鍵盤、鼠標(biāo)、串口(serial port)和終端(terminal)。
4
塊設(shè)備文件
塊設(shè)備文件(block device file)是一種特殊的文件類型,用于與塊設(shè)備進(jìn)行交互。塊設(shè)備是一種數(shù)據(jù)存儲(chǔ)設(shè)備,允許以固定大小的塊(通常為512字節(jié)或更大的倍數(shù))進(jìn)行數(shù)據(jù)讀寫操作。常見的塊設(shè)備包括硬盤、光盤、USB存儲(chǔ)設(shè)備等。
下圖中agpgart、autofs、btrfs-control、console 等這些都是字符設(shè)備文件,而 loop0、loop1這些便是塊設(shè)備文件。
5
符號(hào)鏈接文件
符號(hào)鏈接文件(symbolic link file,也稱為軟鏈接)是一種特殊的文件類型,用于指向另一個(gè)文件或目錄。符號(hào)鏈接類似于Windows系統(tǒng)中的快捷方式。符號(hào)鏈接文件包含指向目標(biāo)文件或目錄的路徑,而不是文件內(nèi)容本身。它們?cè)试S用戶方便地訪問(wèn)和管理文件和目錄。
在上圖中,cdrom、cdrw、fd、initctl等這些文件都是符號(hào)鏈接文件,箭頭所指向的文件路徑便是符號(hào)鏈接文件所指向的文件。
6
套接字文件
套接字文件是Linux系統(tǒng)中用于進(jìn)程間通信的特殊文件類型,常用于本地進(jìn)程間通信。它們?cè)试S同一臺(tái)機(jī)器上的進(jìn)程通過(guò)文件系統(tǒng)中的套接字文件進(jìn)行通信。通過(guò)使用編程接口,可以方便地創(chuàng)建和管理套接字文件,實(shí)現(xiàn)高效的進(jìn)程間通信。
7
管道文件
管道文件(pipe)是一種特殊的文件類型,用于在進(jìn)程間進(jìn)行通信。管道文件提供了一種單向數(shù)據(jù)流的機(jī)制,其中一個(gè)進(jìn)程向管道寫入數(shù)據(jù),而另一個(gè)進(jìn)程從管道讀取數(shù)據(jù)。管道文件在命令行中廣泛用于將一個(gè)命令的輸出傳遞給另一個(gè)命令作為輸入。
8
stat命令和ls命令
stat 命令和 ls 命令是Linux系統(tǒng)中常用的兩個(gè)命令,用于查看文件和目錄的詳細(xì)信息。
8.1、stat命令
stat 命令用于顯示文件或文件系統(tǒng)的詳細(xì)狀態(tài)信息。它提供的信息包括文件的大小、權(quán)限、所有者、修改時(shí)間、訪問(wèn)時(shí)間等。
查看單個(gè)文件的信息:
stat example.txt
輸出示例:
File: example.txtSize: 1234 Blocks: 8 IO Block: 4096 regular fileDevice: 803h/2051d Inode: 1234567 Links: 1Access: (0644/-rw-r--r--) Uid: ( 1000/ user) Gid: ( 1000/ user)Access: 2024-06-06 12:00:00.000000000 +0000Modify: 2024-06-06 12:00:00.000000000 +0000Change: 2024-06-06 12:00:00.000000000 +0000Birth: -
查看目錄的信息:
stat /home/user
輸出示例:
File: /home/userSize: 4096 Blocks: 8 IO Block: 4096 directoryDevice: 803h/2051d Inode: 567890 Links: 2Access: (0755/drwxr-xr-x) Uid: ( 1000/ user) Gid: ( 1000/ user)Access: 2024-06-06 12:00:00.000000000 +0000Modify: 2024-06-06 12:00:00.000000000 +0000Change: 2024-06-06 12:00:00.000000000 +0000Birth: -
8.2、ls命令
ls 命令用于列出目錄內(nèi)容。它有很多選項(xiàng),可以顯示文件的各種信息,如權(quán)限、所有者、大小和修改時(shí)間等。
顯示詳細(xì)信息:
ls -l
輸出示例:
total 12-rw-r--r-- 1 user user 1234 Jun 6 12:00 example.txtdrwxr-xr-x 2 user user 4096 Jun 6 12:00 documentsdrwxr-xr-x 3 user user 4096 Jun 6 12:00 projects
示例參數(shù)說(shuō)明:
' - ':代表普通文件,即包含文本內(nèi)容或二進(jìn)制數(shù)據(jù)的文件。
' d ':代表目錄文件,用于存儲(chǔ)其他文件或目錄的容器。
' c ':代表字符設(shè)備文件,用于與字符設(shè)備進(jìn)行通信,如終端設(shè)備或串行端口。
' b ':代表塊設(shè)備文件,用于與塊設(shè)備進(jìn)行通信,如硬盤驅(qū)動(dòng)器或磁盤分區(qū)。
' l ':代表符號(hào)鏈接文件,用于指向其他文件或目錄的路徑。
' s ':代表套接字文件,用于進(jìn)程間通信,通常用于網(wǎng)絡(luò)通信或本地通信。
' p ':代表管道文件,用于進(jìn)程間通信,允許單向數(shù)據(jù)流的傳輸。
通過(guò)使用這些命令,可以方便地查看文件和目錄的詳細(xì)信息,以便更好地管理和操作系統(tǒng)中的文件。
9
stat、fstat、lstat函數(shù)
stat、fstat、lstat 是Linux中用于獲取文件屬性的系統(tǒng)調(diào)用函數(shù)。它們的主要作用是讀取文件的元數(shù)據(jù),如文件大小、權(quán)限、所有者等。以下是這三個(gè)函數(shù)的詳細(xì)說(shuō)明、作用和使用方法。
stat:獲取指定路徑文件的屬性信息,解析符號(hào)鏈接指向的文件。
fstat:獲取通過(guò)文件描述符指定的文件的屬性信息。
lstat:獲取指定路徑文件的屬性信息,如果是符號(hào)鏈接,返回鏈接本身的屬性。
這些函數(shù)在文件管理和系統(tǒng)編程中非常重要,能夠幫助開發(fā)者獲取文件的詳細(xì)信息并進(jìn)行相應(yīng)處理。理解它們的用法和區(qū)別對(duì)于編寫高效、健壯的程序至關(guān)重要。
在Linux中,stat、fstat、和lstat函數(shù)都使用同一個(gè)結(jié)構(gòu)體struct stat來(lái)存儲(chǔ)文件的元數(shù)據(jù)。這個(gè)結(jié)構(gòu)體包含了文件的多種屬性信息,如文件大小、文件類型、權(quán)限、所有者、時(shí)間戳等。
struct stat結(jié)構(gòu)體定義在頭文件中。它的典型定義如下:
#include <sys/types.h>#include <sys/stat.h>#include <unistd.h> struct stat { dev_t st_dev; /* 文件的設(shè)備ID */ ino_t st_ino; /* 文件的索引節(jié)點(diǎn)號(hào) */ mode_t st_mode; /* 文件的類型和權(quán)限 */ nlink_t st_nlink; /* 硬鏈接數(shù) */ uid_t st_uid; /* 所有者用戶ID */ gid_t st_gid; /* 所有者組ID */ dev_t st_rdev; /* 特殊設(shè)備ID(如果此文件是設(shè)備文件) */ off_t st_size; /* 文件大小,以字節(jié)為單位 */ blksize_t st_blksize; /* 文件系統(tǒng)I/O的塊大小 */ blkcnt_t st_blocks; /* 分配給此文件的512字節(jié)塊的數(shù)量 */ time_t st_atime; /* 最后一次訪問(wèn)時(shí)間 */ time_t st_mtime; /* 最后一次修改時(shí)間 */ time_t st_ctime; /* 最后一次狀態(tài)改變時(shí)間(元數(shù)據(jù)) */};
各字段的含義如下:
st_dev:表示文件所在設(shè)備的設(shè)備號(hào)。文件系統(tǒng)中,每個(gè)設(shè)備都有一個(gè)唯一的設(shè)備號(hào)。
st_ino:表示文件的索引節(jié)點(diǎn)號(hào)(inode number),它是文件在文件系統(tǒng)中的唯一標(biāo)識(shí)。
st_mode:表示文件的類型和權(quán)限。使用位掩碼可以提取出文件類型和權(quán)限信息。
st_nlink:表示文件的硬鏈接數(shù)量。一個(gè)文件可以有多個(gè)硬鏈接,它們共享同一個(gè)索引節(jié)點(diǎn)。
st_uid:表示文件所有者的用戶ID。
st_gid:表示文件所有者的組ID。
st_rdev:如果文件是字符設(shè)備或塊設(shè)備文件,則此字段表示設(shè)備號(hào)。
st_size:表示文件的大小,以字節(jié)為單位。
st_blksize:表示文件系統(tǒng)I/O的塊大小。
st_blocks:表示分配給文件的512字節(jié)塊的數(shù)量。
st_atime:表示文件最后一次訪問(wèn)的時(shí)間。
st_mtime:表示文件最后一次修改的時(shí)間。
st_ctime:表示文件最后一次狀態(tài)改變的時(shí)間(例如,權(quán)限修改)。
9.1、stat函數(shù)
int stat(const char *path, struct stat *buf);
參數(shù):
path:文件路徑。
buf:指向stat結(jié)構(gòu)體的指針,用于存儲(chǔ)文件屬性信息。
返回值:
成功時(shí)返回0。
失敗時(shí)返回-1,并設(shè)置errno來(lái)指示錯(cuò)誤。
作用: 獲取指定路徑文件的屬性信息。
示例如下:
#include <stdio.h>#include <sys/stat.h>#include <time.h> int main() { struct stat fileStat; if (stat("example.txt", &fileStat) < 0) { perror("stat"); return 1; } printf("File Size: %ld bytesn", fileStat.st_size); printf("Number of Links: %lun", fileStat.st_nlink); printf("File inode: %lun", fileStat.st_ino); printf("File Permissions: "); printf((S_ISDIR(fileStat.st_mode)) ? "d" : "-"); printf((fileStat.st_mode & S_IRUSR) ? "r" : "-"); printf((fileStat.st_mode & S_IWUSR) ? "w" : "-"); printf((fileStat.st_mode & S_IXUSR) ? "x" : "-"); printf((fileStat.st_mode & S_IRGRP) ? "r" : "-"); printf((fileStat.st_mode & S_IWGRP) ? "w" : "-"); printf((fileStat.st_mode & S_IXGRP) ? "x" : "-"); printf((fileStat.st_mode & S_IROTH) ? "r" : "-"); printf((fileStat.st_mode & S_IWOTH) ? "w" : "-"); printf((fileStat.st_mode & S_IXOTH) ? "x" : "-"); printf("n"); return 0;}
9.2、fstat函數(shù)
int fstat(int fd, struct stat *buf);
參數(shù):
fd:文件描述符。
buf:指向stat結(jié)構(gòu)體的指針,用于存儲(chǔ)文件屬性信息。
返回值:
成功時(shí)返回0。
失敗時(shí)返回-1,并設(shè)置errno來(lái)指示錯(cuò)誤。
作用: 獲取通過(guò)文件描述符指定的文件的屬性信息。
示例如下:
#include <stdio.h>#include <sys/stat.h>#include <fcntl.h>#include <unistd.h> int main() { struct stat fileStat; int fd = open("example.txt", O_RDONLY); if (fd < 0) { perror("open"); return 1; } if (fstat(fd, &fileStat) < 0) { perror("fstat"); close(fd); return 1; } printf("File Size: %ld bytesn", fileStat.st_size); printf("Number of Links: %lun", fileStat.st_nlink); printf("File inode: %lun", fileStat.st_ino); close(fd); return 0;}
9.3、lstat函數(shù)
int lstat(const char *path, struct stat *buf);
參數(shù):
path:文件路徑。
buf:指向stat結(jié)構(gòu)體的指針,用于存儲(chǔ)文件屬性信息。
返回值:
成功時(shí)返回0。
失敗時(shí)返回-1,并設(shè)置errno來(lái)指示錯(cuò)誤。
作用: 獲取指定路徑文件的屬性信息,但如果路徑是符號(hào)鏈接,返回鏈接本身的屬性,而不是鏈接指向的文件。
示例如下:
#include <stdio.h>#include <sys/stat.h> int main() { struct stat fileStat; if (lstat("symlink", &fileStat) < 0) { perror("lstat"); return 1; } printf("File Size: %ld bytesn", fileStat.st_size); printf("Number of Links: %lun", fileStat.st_nlink); printf("File inode: %lun", fileStat.st_ino); printf("File Permissions: "); printf((S_ISLNK(fileStat.st_mode)) ? "l" : "-"); printf((fileStat.st_mode & S_IRUSR) ? "r" : "-"); printf((fileStat.st_mode & S_IWUSR) ? "w" : "-"); printf((fileStat.st_mode & S_IXUSR) ? "x" : "-"); printf((fileStat.st_mode & S_IRGRP) ? "r" : "-"); printf((fileStat.st_mode & S_IWGRP) ? "w" : "-"); printf((fileStat.st_mode & S_IXGRP) ? "x" : "-"); printf((fileStat.st_mode & S_IROTH) ? "r" : "-"); printf((fileStat.st_mode & S_IWOTH) ? "w" : "-"); printf((fileStat.st_mode & S_IXOTH) ? "x" : "-"); printf("n"); return 0;}
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。