<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

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

嵌入式Linux:Linux系統中文件類(lèi)型

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

在Windows系統中,操作系統通常通過(guò)文件名后綴來(lái)識別文件類(lèi)型。例如,C語(yǔ)言頭文件使用“.h”后綴,C語(yǔ)言源文件使用“.c”后綴,文本文件使用“.txt”后綴,壓縮包文件使用“.zip”后綴。打開(kāi)文件時(shí),Windows會(huì )根據文件名后綴確定文件類(lèi)型,然后調用相應的程序打開(kāi)它。例如,打開(kāi)“.c”文件時(shí)會(huì )使用C代碼編輯器,打開(kāi)“.zip”文件時(shí)會(huì )使用解壓軟件。


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


在Linux系統中,共有七種文件類(lèi)型:


  • 普通文件;

  • 目錄文件;

  • 字符設備文件;

  • 塊設備文件;

  • 符號鏈接文件;

  • 套接字文件;

  • 管道文件。


1


普通文件


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


普通文件可以分為兩大類(lèi):文本文件和二進(jìn)制文件。


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


示例:



cat example.txt



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


示例:




hexdump -C example.bin

2


目錄文件


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



3


字符設備文件


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



4


塊設備文件


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


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


圖片



5


符號鏈接文件


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


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



6


套接字文件


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



7


管道文件


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



8


stat命令和ls命令


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



8.1、stat命令


stat 命令用于顯示文件或文件系統的詳細狀態(tài)信息。它提供的信息包括文件的大小、權限、所有者、修改時(shí)間、訪(fǎng)問(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 命令用于列出目錄內容。它有很多選項,可以顯示文件的各種信息,如權限、所有者、大小和修改時(shí)間等。


顯示詳細信息:




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



示例參數說(shuō)明:


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

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

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

  • ' b ':代表塊設備文件,用于與塊設備進(jìn)行通信,如硬盤(pán)驅動(dòng)器或磁盤(pán)分區。

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

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

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



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



9


stat、fstat、lstat函數


stat、fstat、lstat 是Linux中用于獲取文件屬性的系統調用函數。它們的主要作用是讀取文件的元數據,如文件大小、權限、所有者等。以下是這三個(gè)函數的詳細說(shuō)明、作用和使用方法。


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

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

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



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

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


struct stat結構體定義在頭文件中。它的典型定義如下:

#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>
struct stat {    dev_t     st_dev;         /* 文件的設備ID */    ino_t     st_ino;         /* 文件的索引節點(diǎn)號 */    mode_t    st_mode;        /* 文件的類(lèi)型和權限 */    nlink_t   st_nlink;       /* 硬鏈接數 */    uid_t     st_uid;         /* 所有者用戶(hù)ID */    gid_t     st_gid;         /* 所有者組ID */    dev_t     st_rdev;        /* 特殊設備ID(如果此文件是設備文件) */    off_t     st_size;        /* 文件大小,以字節為單位 */    blksize_t st_blksize;     /* 文件系統I/O的塊大小 */    blkcnt_t  st_blocks;      /* 分配給此文件的512字節塊的數量 */    time_t    st_atime;       /* 最后一次訪(fǎng)問(wèn)時(shí)間 */    time_t    st_mtime;       /* 最后一次修改時(shí)間 */    time_t    st_ctime;       /* 最后一次狀態(tài)改變時(shí)間(元數據) */};



各字段的含義如下:


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

  • st_ino:表示文件的索引節點(diǎn)號(inode number),它是文件在文件系統中的唯一標識。

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

  • st_nlink:表示文件的硬鏈接數量。一個(gè)文件可以有多個(gè)硬鏈接,它們共享同一個(gè)索引節點(diǎn)。

  • st_uid:表示文件所有者的用戶(hù)ID。

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

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

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

  • st_blksize:表示文件系統I/O的塊大小。

  • st_blocks:表示分配給文件的512字節塊的數量。

  • st_atime:表示文件最后一次訪(fǎng)問(wèn)的時(shí)間。

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

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




9.1、stat函數


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



參數:


  • path:文件路徑。

  • buf:指向stat結構體的指針,用于存儲文件屬性信息。



返回值:


  • 成功時(shí)返回0。

  • 失敗時(shí)返回-1,并設置errno來(lái)指示錯誤。



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

示例如下:

#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函數


int fstat(int fd, struct stat *buf);



參數:


  • fd:文件描述符。

  • buf:指向stat結構體的指針,用于存儲文件屬性信息。



返回值:


  • 成功時(shí)返回0。

  • 失敗時(shí)返回-1,并設置errno來(lái)指示錯誤。

作用: 獲取通過(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函數


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



參數:


  • path:文件路徑。

  • buf:指向stat結構體的指針,用于存儲文件屬性信息。



返回值:


  • 成功時(shí)返回0。

  • 失敗時(shí)返回-1,并設置errno來(lái)指示錯誤。



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


示例如下:

#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;}


*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



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

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>