日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
深入解析Linux文件接口,掌握文件操作技能(linux文件接口)

Linux作為一種主流的操作系統(tǒng),廣泛應(yīng)用于各種領(lǐng)域,其中文件操作是Linux系統(tǒng)中經(jīng)常使用的重要功能之一。了解和掌握linux文件接口,能夠更加方便、高效地進行文件讀寫和管理操作。在本文中,我們將,從而讓讀者更加熟練地使用Linux系統(tǒng)。

創(chuàng)新互聯(lián)專注于企業(yè)成都營銷網(wǎng)站建設(shè)、網(wǎng)站重做改版、雙陽網(wǎng)站定制設(shè)計、自適應(yīng)品牌網(wǎng)站建設(shè)、H5高端網(wǎng)站建設(shè)、商城網(wǎng)站開發(fā)、集團公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計等建站業(yè)務(wù),價格優(yōu)惠性價比高,為雙陽等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

一、 Linux 文件接口概述

在Linux系統(tǒng)中,內(nèi)核對文件的操作通過系統(tǒng)調(diào)用(syscall)來實現(xiàn),文件接口便是系統(tǒng)調(diào)用的。文件接口定義的系統(tǒng)調(diào)用提供了對文件的打開、讀寫、關(guān)閉、創(chuàng)建、刪除、重命名等操作。這些系統(tǒng)調(diào)用通過C庫中的封裝函數(shù)達到了用戶空間的程序調(diào)用。

常用的文件接口包括:

1. open:打開一個文件

2. close:關(guān)閉一個文件

3. read:從一個文件中讀取數(shù)據(jù)

4. write:往一個文件中寫入數(shù)據(jù)

5. lseek:移動文件讀寫位置

6. ioctl:設(shè)備控制

7. mkdir:創(chuàng)建目錄

8. rmdir:刪除目錄

9. rename:重命名文件名

10. unlink:刪除文件

11. access:檢查文件訪問權(quán)限

12. stat:獲取文件屬性

13. fcntl:文件控制操作

14. chown:修改文件擁有者

15. chmod:修改文件權(quán)限

16. exec:啟動新進程

二、 文件描述符處理

在Linux系統(tǒng)中,系統(tǒng)調(diào)用返回的句柄被稱為文件描述符,我們需要對文件描述符進行處理。

1. 打開文件

我們通過調(diào)用open函數(shù)來打開文件,并獲得文件描述符。 open的常用參數(shù)如下:

“`C

#include

int open(const char *pathname, int flags, mode_t mode);

//pathname:文件名,可以是相對路徑或絕對路徑

//flags:文件打開方式,只讀、只寫、讀寫等

//mode:指定該文件的權(quán)限,當(dāng)文件不存在時,會創(chuàng)建該文件并設(shè)置該權(quán)限

“`

2. 關(guān)閉文件

文件使用完畢后,需要關(guān)閉文件,即釋放文件句柄。關(guān)閉文件使用close函數(shù):

“`C

#include

int close(int fd);

“`

當(dāng)我們使用open函數(shù)打開一個文件時,會返回該文件的文件描述符fd。因此,當(dāng)我們對文件操作結(jié)束后,應(yīng)該使用close函數(shù)關(guān)閉該文件。

3. 文件讀寫

Linux文件操作中最頻繁的操作,是從文件中讀取數(shù)據(jù)和向文件中寫入數(shù)據(jù)。

(1)讀取數(shù)據(jù)

使用read函數(shù)從文件中讀取數(shù)據(jù),函數(shù)定義如下:

“`C

#include

ssize_t read(int fd, void *buf, size_t count);

//fd:文件描述符

//buf:保存讀取數(shù)據(jù)的緩存區(qū)

//count:要讀取的字節(jié)數(shù)

//返回值:成功讀取的字節(jié)數(shù),失敗返回-1

“`

(2)寫入數(shù)據(jù)

使用write函數(shù)從數(shù)據(jù)寫入文件,函數(shù)定義如下:

“`C

#include

ssize_t write(int fd, const void *buf, size_t count);

//fd:文件描述符

//buf:要寫入的數(shù)據(jù)緩存區(qū)

//count:要寫入的字節(jié)數(shù)

//返回值:成功寫入的字節(jié)數(shù),失敗返回-1

“`

4. 文件讀寫位置控制

在文件讀寫過程中,我們需要控制讀寫的位置,lseek函數(shù)提供了這個功能。lseek函數(shù)定義如下:

“`C

#include

off_t lseek(int fd, off_t offset, int whence);

//fd:文件描述符

//offset:偏移量

//whence:基準(zhǔn)位置,SEEK_SET(文件開頭)、SEEK_CUR(當(dāng)前位置)、SEEK_END(文件結(jié)尾)

//返回值:如果成功,則返回文件指針相對于文件首地址 SEEK_SET 的位移量,否則返回-1

“`

5. 文件屬性操作

Linux系統(tǒng)中通過stat函數(shù)可以獲取文件的屬性信息,包括文件的大小、訪問權(quán)限、修改時間等。函數(shù)定義如下:

“`C

#include

#include

#include

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

//path:文件路徑

//buf:存放文件屬性的結(jié)構(gòu)體指針

//返回值:成功返回0,出錯返回-1

“`

此外,還可以使用chmod函數(shù)修改文件權(quán)限、chown函數(shù)修改文件的所有者。

三、 文件操作實例

我們以實際案例,使用Linux文件操作接口實現(xiàn)文件讀寫和操作。代碼如下:

“`C++

#include

#include

#include

#include

#include

#include

#include

#include

#define BUFFER_SIZE (1024)

int mn(int argc, char* argv[])

{

int ret;

int fd;

char buffer[BUFFER_SIZE] = {0};

const char* filename_in = “input.txt”;

const char* filename_out = “output.txt”;

struct stat filestat;

// 打開一個文件,獲取文件描述符fd

fd = open(filename_in, O_RDON);

if(fd

{

fprintf(stderr, “open %s fled: %s\n”, filename_in, strerror(errno));

return -1;

}

//獲取文件屬性,文件大小等

ret = stat(filename_in, &filestat);

if (ret

{

fprintf(stderr, “Fled to get file attribute, errno:%d, strerror:%s\n”, errno, strerror(errno));

close(fd);

return -1;

}

// 打開一個文件,獲取文件描述符fd

int fd_out = open(filename_out, O_WRON|O_CREAT|O_TRUNC, 0666);

if(fd_out

{

fprintf(stderr, “open %s fled: %s\n”, filename_in, strerror(errno));

close(fd);

return -1;

}

//讀取文件

while(true)

{

ret = read(fd, buffer, BUFFER_SIZE-1);

if(ret == 0)

{

break;

}

if(ret

{

fprintf(stderr, “Fled to read data, errno:%d, strerror:%s\n”, errno, strerror(errno));

break;

}

//把讀取到的數(shù)據(jù)寫到另一個文件中

ret = write(fd_out, buffer, ret);

if(ret

{

fprintf(stderr, “Fled to write data to file, errno:%d, strerror:%s\n”, errno, strerror(errno));

break;

}

}

close(fd);

close(fd_out);

return 0;

}

“`

該程序可以將文件input.txt中的內(nèi)容讀取出來,并寫入到文件output.txt中。程序先通過open函數(shù)打開input.txt文件,打開成功后,再通過read函數(shù)循環(huán)讀取文件內(nèi)容,循環(huán)結(jié)束后,關(guān)閉input.txt文件,并以寫入方式打開文件output.txt,通過write函數(shù)將讀取到的內(nèi)容寫入該文件,在完成寫入后關(guān)閉output.txt文件。

四、

相關(guān)問題拓展閱讀:

  • linux文件系統(tǒng)基礎(chǔ)知識

linux文件系統(tǒng)基礎(chǔ)知識

linux文件系統(tǒng)基礎(chǔ)知識匯總

  1、linux文件系統(tǒng)分配策略

  塊分配( block allocation ) 和 擴展分配 ( extent allocation )

  塊分配:磁盤上的文件塊根據(jù)需要分配給文件,避免了存儲空間的浪升團費。但當(dāng)文件擴充時,會造成文件中文件塊的不連續(xù),從而導(dǎo)致過多的磁盤尋道時間。

  每一次文件擴展時,塊分配算法就需要寫入文件塊的結(jié)構(gòu)信息,也就是 meta-dada 。meta-data總是與文件一起寫入存儲設(shè)備,改變文件的操作要等到所有meta-data的操作都完成后才能進行,

  因此,meta-data的操作會明顯降低整個文件系統(tǒng)的性能。

  擴展分配: 文件創(chuàng)建時,一次性分配一連串連續(xù)的塊,當(dāng)文件擴展時,也一次分配很多塊。meta-data在文件創(chuàng)建時寫入,當(dāng)文件大小沒有超過所有已分配文件塊大小時,就不用寫入meta-data,直到需要再分配文件塊的時候。

  擴展分配采用成組分配塊的方式,減少了SCSI設(shè)備寫數(shù)據(jù)的時間,在讀取順序文件時具有良好的性能,但隨機讀取文件時,就和塊分配類似了。

  文件塊的組或塊簇 ( block cluster) 的大小是在編譯時確定的。簇的大小對文件系統(tǒng)的性能有很大的影響。

  注: meta-data 元信息:和文件有關(guān)的信息,比如權(quán)限、所有者以及創(chuàng)建、訪問或更改時間等。

  2、文件的記錄形式

  linux文家系統(tǒng)使用索引節(jié)點(inode)來記錄文件信息。索引節(jié)點是一種數(shù)據(jù)結(jié)構(gòu),它包含了一個文件的長度、創(chuàng)建及修改時間、權(quán)限、所屬關(guān)系、磁盤中的位置等信息。

  一個文件系統(tǒng)維護了一個索引節(jié)點的數(shù)組,每個文件或目錄都與索引節(jié)點數(shù)組中的唯一的元素對應(yīng)。每個索引節(jié)點在數(shù)組中的索引號,稱為索引節(jié)點號。

  linux文件系統(tǒng)將文件索引節(jié)點號和文件名同時保存在目錄中,所以,目錄只是將文件的名稱和它的索引節(jié)點號結(jié)合在一起的一張表,目錄中每一對文件名稱和索引節(jié)點號稱為一個連接。

  對于一個文件來說,有一個索引節(jié)點號與之對應(yīng);而對于一個索引節(jié)點號,卻可以對應(yīng)多個文件名。

  連接分為軟連接和硬連接,其中軟吵信橘連接又叫符號連接。

  硬連接: 原文件名和連接文件名都指向相同的物理地址。目錄不能有硬連接;硬連接不能跨文件系統(tǒng)(不能跨越不同的分區(qū)),文件在磁盤中只有一個拷貝。

  由于刪除文件要在同一個索引節(jié)點屬于唯一的連接時才能成功,因此硬連接可以防止不必要的誤刪除。

  軟連接: 用 ln -s 命令建立文件的符號連接。符號連接是linux特殊文件的.一種,作為一個文件,它的數(shù)據(jù)是它所連接的文件的路徑名。坦歲沒有防止誤刪除的功能。

  3、文件系統(tǒng)類型:

  ext2 : 早期linux中常用的文件系統(tǒng)

  ext3 : ext2的升級版,帶日志功能

  RAMFS : 內(nèi)存文件系統(tǒng),速度很快

  NFS : 網(wǎng)絡(luò)文件系統(tǒng),由SUN發(fā)明,主要用于遠(yuǎn)程文件共享

  MS-DOS : MS-DOS文件系統(tǒng)

  VFAT : Windows 95/98 操作系統(tǒng)采用的文件系統(tǒng)

  FAT : Windows XP 操作系統(tǒng)采用的文件系統(tǒng)

  NTFS : Windows NT/XP 操作系統(tǒng)采用的文件系統(tǒng)

  HPFS : OS/2 操作系統(tǒng)采用的文件系統(tǒng)

  PROC : 虛擬的進程文件系統(tǒng)

  ISO9660 : 大部分光盤所采用的文件系統(tǒng)

  ufsSun : OS 所采用的文件系統(tǒng)

  NCPFS : Novell 服務(wù)器所采用的文件系統(tǒng)

  BFS : Samba 的共享文件系統(tǒng)

  XFS : 由SGI開發(fā)的先進的日志文件系統(tǒng),支持超大容量文件

  JFS :IBM的AIX使用的日志文件系統(tǒng)

  ReiserFS : 基于平衡樹結(jié)構(gòu)的文件系統(tǒng)

  udf: 可擦寫的數(shù)據(jù)光盤文件系統(tǒng)

  4、虛擬文件系統(tǒng)VFS

  linux支持的所有文件系統(tǒng)稱為邏輯文件系統(tǒng),而linux在傳統(tǒng)的邏輯文件系統(tǒng)的基礎(chǔ)上增加料一個蓄念文件系統(tǒng)( Vitual File System ,VFS) 的接口層。

  虛擬文件系統(tǒng)(VFS) 位于文件系統(tǒng)的最上層,管理各種邏輯文件系統(tǒng),并可以屏蔽各種邏輯文件系統(tǒng)之間的差異,提供統(tǒng)一文件和設(shè)備的訪問接口。

  5、文件的邏輯結(jié)構(gòu)

  文件的邏輯結(jié)構(gòu)可分為兩大類: 字節(jié)流式的無結(jié)構(gòu)文件 和 記錄式的有結(jié)構(gòu)文件。

  由字節(jié)流(字節(jié)序列)組成的文件是一種無結(jié)構(gòu)文件或流式文件 ,不考慮文件內(nèi)部的邏輯結(jié)構(gòu),只是簡單地看作是一系列字節(jié)的序列,便于在文件的任意位置添加內(nèi)容。

  由記錄組成的文件稱為記錄式文件 ,記錄是這種文件類型的基本信息單位,記錄式文件通用于信息管理。

  6、文件類型

  普通文件 : 通常是流式文件

  目錄文件 : 用于表示和管理系統(tǒng)中的全部文件

  連接文件 : 用于不同目錄下文件的共享

  設(shè)備文件 : 包括塊設(shè)備文件和字符設(shè)備文件,塊設(shè)備文件表示磁盤文件、光盤等,字符設(shè)備文件按照字符操作終端、鍵盤等設(shè)備。

  管道(FIFO)文件 : 提供進程建通信的一種方式

  套接字(socket) 文件: 該文件類型與網(wǎng)絡(luò)通信有關(guān)

  7、文件結(jié)構(gòu): 包括索引節(jié)點和數(shù)據(jù)

  索引節(jié)點 : 又稱 I 節(jié)點,在文件系統(tǒng)結(jié)構(gòu)中,包含有關(guān)相應(yīng)文件的信息的一個記錄,這些信息包括文件權(quán)限、文件名、文件大小、存放位置、建立日期等。文件系統(tǒng)中所有文件的索引節(jié)點保存在索引節(jié)點表中。

  數(shù)據(jù) : 文件的實際內(nèi)容??梢允强盏模部梢苑浅4?,并且擁有自己的結(jié)構(gòu)。

  8、ext2文件系統(tǒng)

  ext2文件系統(tǒng)的數(shù)據(jù)塊大小一般為 1024B、2023B 或 4096B

  ext2文件系統(tǒng)采用的索引節(jié)點(inode):

  索引節(jié)點采用了多重索引結(jié)構(gòu),主要體現(xiàn)在直接指針和3個間接指針。直接指針包含12個直接指針塊,它們直接指向包含文件數(shù)據(jù)的數(shù)據(jù)塊,緊接在后面的3個間接指針是為了適應(yīng)文件的大小變化而設(shè)計的。

  e.g: 假設(shè)數(shù)據(jù)塊大小為1024B ,利用12個直接指針,可以保存更大為12KB的文件,當(dāng)文件超過12KB時,則要利用單級間接指針,該指針指向的數(shù)據(jù)塊保存有一組數(shù)據(jù)塊指針,這些指針依次指向包含有實際數(shù)據(jù)的數(shù)據(jù)塊,

  假如每個指針占用4B,則每個單級指針數(shù)據(jù)塊可保存 1024/4=256 個數(shù)據(jù)指針,因此利用直接指針和單級間接指針可保存 1024*12+1024*256=268 KB的文件。當(dāng)文件超過268KB時,再利用二級間接指針,直到使用三級間接指針。

  利用直接指針、單級間接指針、二級間接指針、三級間接指針可保存的更大文件大小為:

*12+1024*256+1024*256*256+1024*256*256*256=KB,約 16GB

  若數(shù)據(jù)塊大小為2023B,指針占4B,則更大文件大小為: 2023*12+2023*512+2023*512*512+2023*512*512*512=268,960,792 KB 約 268GB

  若數(shù)據(jù)塊大小為4096B,指針占4B,則更大文件大小為: 4096*12+4096*1024+4096*1024*1024+4096*1024*1024*1024=4,299,165,744 KB ,約 4TB

  注: 命令 tune2fs -l /dev/sda5 可查看文件系統(tǒng)

  ext2文件系統(tǒng)更大文件名長度: 255個字符

  ext2文件系統(tǒng)的缺點:

  ext2在寫入文件內(nèi)容的同時并沒有同時寫入文件meta-data, 其工作順序是先寫入文件的內(nèi)容,然后等空閑時候才寫入文件的meta-data。若發(fā)生意外,則文件系統(tǒng)就會處于不一致狀態(tài)。

  在重新啟動系統(tǒng)的時候,linux會啟動 fsk ( file system check) 的程序,掃描整個文件系統(tǒng)并試圖修復(fù),但不提供保證。

  9、ext3文件系統(tǒng):

  ext3基于ext2的代碼,所以磁盤格式與ext2相同,使用相同的元數(shù)據(jù)。

  ext2文件系統(tǒng)無損轉(zhuǎn)化為ext3文件系統(tǒng): tune2fs -j /dev/sda6

  日志塊設(shè)備( Journaling block device layer,JBD)完成ext3文件系統(tǒng)日志功能。JBD不是ext3文件系統(tǒng)所特有的,它的設(shè)計目標(biāo)是為了向一個塊設(shè)備添加日志功能。

  當(dāng)一個文件修改執(zhí)行時,ext3文件系統(tǒng)代碼將通知JBD,稱為一個事務(wù)(transaction)。發(fā)生意外時,日志功能具有的重放功能,能重新執(zhí)行中斷的事務(wù)。

  日志中的3種數(shù)據(jù)模式:

)、data=writeback :不處理任何形式的日志數(shù)據(jù),給用戶整體上的更高性能

)、data=odered :只記錄元數(shù)據(jù)日志,但將元數(shù)據(jù)和數(shù)據(jù)組成一個單元稱為事務(wù)(transaction) 。此模式保持所句句的可靠性與文件系統(tǒng)的一致性,性能遠(yuǎn)低于data=writeback模式,但比data=journal模式快

)、data=journal :提供完整的數(shù)據(jù)及元數(shù)據(jù)日志,所有新數(shù)據(jù)首先被寫入日志,然后才被定位。意外發(fā)生過后,日志可以被重放,將數(shù)據(jù)與元數(shù)據(jù)帶回一致狀態(tài)。這種模式整體性能最慢,但數(shù)據(jù)需要從磁盤讀取和寫入磁盤時卻是3種模式中最快的。

  ext3文件系統(tǒng)更大文件名長度: 255個字符

  ext3文件系統(tǒng)的優(yōu)點:可用性、數(shù)據(jù)完整性、速度、兼容性

  10、ReiserFS文件系統(tǒng)

  ReiserFS文件系統(tǒng)是由Hans Reiser和他領(lǐng)導(dǎo)的開發(fā)小組共同開發(fā)的,整個文件系統(tǒng)完全是從頭設(shè)計的,是一個非常優(yōu)秀的文件系統(tǒng)。也是最早用于Linux的日志文件系統(tǒng)之一。

  ReiserFS的特點

  先進的日志機制

  ReiserFS有先進的日志(Journaling/logging)功能 機制。日志機制保證了在每個實際數(shù)據(jù)修改之前,相應(yīng)的日志已經(jīng)寫入硬盤。文件與數(shù)據(jù)的安全性有了很大提高。

  高效的磁盤空間利用

  Reiserfs對一些小文件不分配inode。而是將這些文件打包,存放在同一個磁盤分塊中。而其它文件系統(tǒng)則為每個小文件分別放置到一個磁盤分塊中。

  獨特的搜尋方式

  ReiserFS基于快速平衡樹(balanced tree)搜索,平衡樹在性能上非常卓越,這是一種非常高效的算法。ReiserFS搜索大量文件時,搜索速度要比ext2快得多。Reiserfs文件 系統(tǒng)使用B*Tree存儲文件,而其它文件系統(tǒng)使用B+Tree樹。B*Tree查詢速度比B+Tree要快很多。Reiserfs在文件定位上速度非常 快。

  在實際運用中,ReiserFS 在處理小于 4k 的文件時,比ext2 快 5 倍;帶尾文件壓縮功能(默認(rèn))的ReiserFS 比ext2文件系統(tǒng)多存儲6%的數(shù)據(jù)。

  支持海量磁盤

  ReiserFS是一個非常優(yōu)秀的文件系統(tǒng),一直被用在高端UNIX系統(tǒng)上,可輕松管理上百G的文件系統(tǒng),ReiserFS文件系統(tǒng)更大支持的文件系統(tǒng)尺寸為16TB。這非常適合企業(yè)級應(yīng)用中。

  優(yōu)異的性能

  由于它的高效存儲和快速小文件I/O特點,使用ReiserFs文件系統(tǒng)的PC,在啟動X窗口系統(tǒng)時,所花的時間要比在同一臺機器上使用ext2文 件系統(tǒng)少1/3。另外,ReiserFS文件系統(tǒng)支持單個文件尺寸為4G的文件,這為大型數(shù)據(jù)庫系統(tǒng)在linux上的應(yīng)用提供了更好的選擇。

;

linux文件接口的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關(guān)于linux文件接口,深入解析Linux文件接口,掌握文件操作技能,linux文件系統(tǒng)基礎(chǔ)知識的信息別忘了在本站進行查找喔。

創(chuàng)新互聯(lián)網(wǎng)絡(luò)推廣網(wǎng)站建設(shè),網(wǎng)站設(shè)計,網(wǎng)站建設(shè)公司,網(wǎng)站制作,網(wǎng)頁設(shè)計,1500元定制網(wǎng)站優(yōu)化全包,先排名后付費,已為上千家服務(wù),聯(lián)系電話:13518219792


當(dāng)前標(biāo)題:深入解析Linux文件接口,掌握文件操作技能(linux文件接口)
網(wǎng)站地址:http://www.dlmjj.cn/article/dpieiod.html