博客專欄

EEPW首頁(yè) > 博客 > 嵌入式Linux:Linux系統(tǒng)中文件類型

嵌入式Linux:Linux系統(tǒng)中文件類型

發(fā)布人:美男子玩編程 時(shí)間:2024-07-29 來(lái)源:工程師 發(fā)布文章

在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)系工作人員刪除。



關(guān)鍵詞: 嵌入式 Linux

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉