博客專欄

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

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

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

在Windows系統(tǒng)中,操作系統(tǒng)通常通過文件名后綴來識別文件類型。例如,C語言頭文件使用“.h”后綴,C語言源文件使用“.c”后綴,文本文件使用“.txt”后綴,壓縮包文件使用“.zip”后綴。打開文件時,Windows會根據(jù)文件名后綴確定文件類型,然后調(diào)用相應的程序打開它。例如,打開“.c”文件時會使用C代碼編輯器,打開“.zip”文件時會使用解壓軟件。


然而,在Linux系統(tǒng)中,文件類型并不是通過文件后綴名來識別的。這并不意味著文件名后綴可以隨意添加。文件名和后綴主要是為了方便“人”查看和識別。盡管Linux系統(tǒng)不依賴后綴來識別文件,但規(guī)范地使用后綴仍然很重要。例如,C源文件應以“.c”結(jié)尾,C頭文件應以“.h”結(jié)尾,Shell腳本文件應以“.sh”結(jié)尾。這是為了方便我們自己查看和管理文件。


在Linux系統(tǒng)中,共有七種文件類型:


  • 普通文件;

  • 目錄文件;

  • 字符設備文件;

  • 塊設備文件;

  • 符號鏈接文件;

  • 套接字文件;

  • 管道文件。


1


普通文件


普通文件(regular file)是Linux系統(tǒng)中最常見的文件類型,如文本文件、二進制文件以及我們編寫的源代碼文件等。普通文件中的數(shù)據(jù)存儲在系統(tǒng)磁盤中,可以訪問和讀取這些文件中的內(nèi)容,文件內(nèi)容以字節(jié)為單位進行存儲和訪問。


普通文件可以分為兩大類:文本文件和二進制文件。


文本文件:文本文件的內(nèi)容由ASCII碼字符構(gòu)成。雖然文件本質(zhì)上都是數(shù)字(因為計算機只識別0和1,磁盤上的文件內(nèi)容也是由0和1構(gòu)成),但文本文件中的數(shù)字應該被理解為對應的ASCII字符碼。例如,常見的.c、.h、.sh、.txt文件都是文本文件。文本文件的優(yōu)點是方便人類閱讀、瀏覽和編寫。


示例:



cat example.txt



二進制文件:二進制文件中存儲的也是數(shù)字,但這些數(shù)字不是文本字符編碼,而是真正的數(shù)值。例如,Linux系統(tǒng)下的可執(zhí)行文件、C代碼編譯后的.o文件、.bin文件等都是二進制文件。


示例:




hexdump -C example.bin

2


目錄文件


目錄文件(directory file)是用于組織和管理其他文件和子目錄的特殊文件。目錄文件包含指向其他文件和目錄的列表,使得文件系統(tǒng)具有層次結(jié)構(gòu)。目錄文件的主要作用是提供一種方式來組織文件系統(tǒng)中的數(shù)據(jù),使得文件和目錄可以以一種樹狀結(jié)構(gòu)進行管理。



3


字符設備文件


字符設備文件(Character Device File)是一種特殊的文件類型,用于與字符設備進行直接的字符流通信。字符設備通常是那些可以一次一個字符地讀寫的設備,如鍵盤、鼠標、串口(serial port)和終端(terminal)。



4


塊設備文件


塊設備文件(block device file)是一種特殊的文件類型,用于與塊設備進行交互。塊設備是一種數(shù)據(jù)存儲設備,允許以固定大小的塊(通常為512字節(jié)或更大的倍數(shù))進行數(shù)據(jù)讀寫操作。常見的塊設備包括硬盤、光盤、USB存儲設備等。


下圖中agpgart、autofs、btrfs-control、console 等這些都是字符設備文件,而 loop0、loop1這些便是塊設備文件。


圖片



5


符號鏈接文件


符號鏈接文件(symbolic link file,也稱為軟鏈接)是一種特殊的文件類型,用于指向另一個文件或目錄。符號鏈接類似于Windows系統(tǒng)中的快捷方式。符號鏈接文件包含指向目標文件或目錄的路徑,而不是文件內(nèi)容本身。它們允許用戶方便地訪問和管理文件和目錄。


在上圖中,cdrom、cdrw、fd、initctl等這些文件都是符號鏈接文件,箭頭所指向的文件路徑便是符號鏈接文件所指向的文件。



6


套接字文件


套接字文件是Linux系統(tǒng)中用于進程間通信的特殊文件類型,常用于本地進程間通信。它們允許同一臺機器上的進程通過文件系統(tǒng)中的套接字文件進行通信。通過使用編程接口,可以方便地創(chuàng)建和管理套接字文件,實現(xiàn)高效的進程間通信。



7


管道文件


管道文件(pipe)是一種特殊的文件類型,用于在進程間進行通信。管道文件提供了一種單向數(shù)據(jù)流的機制,其中一個進程向管道寫入數(shù)據(jù),而另一個進程從管道讀取數(shù)據(jù)。管道文件在命令行中廣泛用于將一個命令的輸出傳遞給另一個命令作為輸入。



8


stat命令和ls命令


stat 命令和 ls 命令是Linux系統(tǒng)中常用的兩個命令,用于查看文件和目錄的詳細信息。



8.1、stat命令


stat 命令用于顯示文件或文件系統(tǒng)的詳細狀態(tài)信息。它提供的信息包括文件的大小、權(quán)限、所有者、修改時間、訪問時間等。

查看單個文件的信息:




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)容。它有很多選項,可以顯示文件的各種信息,如權(quán)限、所有者、大小和修改時間等。


顯示詳細信息:




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ù)說明:


  • ' - ':代表普通文件,即包含文本內(nèi)容或二進制數(shù)據(jù)的文件。

  • ' d ':代表目錄文件,用于存儲其他文件或目錄的容器。

  • ' c ':代表字符設備文件,用于與字符設備進行通信,如終端設備或串行端口。

  • ' b ':代表塊設備文件,用于與塊設備進行通信,如硬盤驅(qū)動器或磁盤分區(qū)。

  • ' l ':代表符號鏈接文件,用于指向其他文件或目錄的路徑。

  • ' s ':代表套接字文件,用于進程間通信,通常用于網(wǎng)絡通信或本地通信。

  • ' p ':代表管道文件,用于進程間通信,允許單向數(shù)據(jù)流的傳輸。



通過使用這些命令,可以方便地查看文件和目錄的詳細信息,以便更好地管理和操作系統(tǒng)中的文件。



9


stat、fstat、lstat函數(shù)


stat、fstat、lstat 是Linux中用于獲取文件屬性的系統(tǒng)調(diào)用函數(shù)。它們的主要作用是讀取文件的元數(shù)據(jù),如文件大小、權(quán)限、所有者等。以下是這三個函數(shù)的詳細說明、作用和使用方法。


  • stat:獲取指定路徑文件的屬性信息,解析符號鏈接指向的文件。

  • fstat:獲取通過文件描述符指定的文件的屬性信息。

  • lstat:獲取指定路徑文件的屬性信息,如果是符號鏈接,返回鏈接本身的屬性。



這些函數(shù)在文件管理和系統(tǒng)編程中非常重要,能夠幫助開發(fā)者獲取文件的詳細信息并進行相應處理。理解它們的用法和區(qū)別對于編寫高效、健壯的程序至關重要。

在Linux中,stat、fstat、和lstat函數(shù)都使用同一個結(jié)構(gòu)體struct stat來存儲文件的元數(shù)據(jù)。這個結(jié)構(gòu)體包含了文件的多種屬性信息,如文件大小、文件類型、權(quán)限、所有者、時間戳等。


struct stat結(jié)構(gòu)體定義在頭文件中。它的典型定義如下:

#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>
struct stat {    dev_t     st_dev;         /* 文件的設備ID */    ino_t     st_ino;         /* 文件的索引節(jié)點號 */    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;        /* 特殊設備ID(如果此文件是設備文件) */    off_t     st_size;        /* 文件大小,以字節(jié)為單位 */    blksize_t st_blksize;     /* 文件系統(tǒng)I/O的塊大小 */    blkcnt_t  st_blocks;      /* 分配給此文件的512字節(jié)塊的數(shù)量 */    time_t    st_atime;       /* 最后一次訪問時間 */    time_t    st_mtime;       /* 最后一次修改時間 */    time_t    st_ctime;       /* 最后一次狀態(tài)改變時間(元數(shù)據(jù)) */};



各字段的含義如下:


  • st_dev:表示文件所在設備的設備號。文件系統(tǒng)中,每個設備都有一個唯一的設備號。

  • st_ino:表示文件的索引節(jié)點號(inode number),它是文件在文件系統(tǒng)中的唯一標識。

  • st_mode:表示文件的類型和權(quán)限。使用位掩碼可以提取出文件類型和權(quán)限信息。

  • st_nlink:表示文件的硬鏈接數(shù)量。一個文件可以有多個硬鏈接,它們共享同一個索引節(jié)點。

  • st_uid:表示文件所有者的用戶ID。

  • st_gid:表示文件所有者的組ID。

  • st_rdev:如果文件是字符設備或塊設備文件,則此字段表示設備號。

  • st_size:表示文件的大小,以字節(jié)為單位。

  • st_blksize:表示文件系統(tǒng)I/O的塊大小。

  • st_blocks:表示分配給文件的512字節(jié)塊的數(shù)量。

  • st_atime:表示文件最后一次訪問的時間。

  • st_mtime:表示文件最后一次修改的時間。

  • st_ctime:表示文件最后一次狀態(tài)改變的時間(例如,權(quán)限修改)。




9.1、stat函數(shù)


int stat(const char *path, struct stat *buf);



參數(shù):


  • path:文件路徑。

  • buf:指向stat結(jié)構(gòu)體的指針,用于存儲文件屬性信息。



返回值:


  • 成功時返回0。

  • 失敗時返回-1,并設置errno來指示錯誤。



作用: 獲取指定路徑文件的屬性信息。

示例如下:

#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)體的指針,用于存儲文件屬性信息。



返回值:


  • 成功時返回0。

  • 失敗時返回-1,并設置errno來指示錯誤。

作用: 獲取通過文件描述符指定的文件的屬性信息。


示例如下:


#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)體的指針,用于存儲文件屬性信息。



返回值:


  • 成功時返回0。

  • 失敗時返回-1,并設置errno來指示錯誤。



作用: 獲取指定路徑文件的屬性信息,但如果路徑是符號鏈接,返回鏈接本身的屬性,而不是鏈接指向的文件。


示例如下:

#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)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。



關鍵詞: 嵌入式 Linux

相關推薦

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

關閉