Linux操作文件的底層系統怎么調用

linux操作系統奉行一切皆文件的理念,所有文件設備幾乎都可以用一套系統調用即open()/close()/write()/read()等來操作。系統調用和c庫調用操作文件類似。linux自帶的man手冊是最權威的。通過查看man手冊來查看系統調用用法。

代號 —— 代表的含義

  • 1 —— 用戶在shell環境下可操作/可執行的命令

  • 2 —— 系統內核可調用的函數與工具

  • 3 —— 一些常用的函數與函數庫,大部分C的函數庫

  • 4 —— 設備文件的說明,通常是在 /dev下的設備

  • 5 —— 配置文件或某些文件的格式

  • 6 —— 游戲

  • 7 —— 管理與協議等,例如Linux文件系統、網絡協議等

  • 8 —— 系統管理員可用的命令

  • 9 —— 與Kernel有關的文件

注意,系統的頭文件在Linux中一般存放在/usr/include目錄下;下面包含的一些頭文件有的帶了sys,其實是include底下的子目錄中的頭文件

open()——打開或者創建一個文件

Linux操作文件的底層系統怎么調用

返回值類型: int——文件描述符fd,每打開一個文件,就會得到一個文件描述符,這個文件描述符是整形的,我們通過文件描述符進行讀寫操作。

  • 失敗:-1

  • 成功:>= 0,即文件描述符;

  • mode_t是一個類型別名,實際上就是一個有符號的整數,對open函數而言,僅僅當創建新文件時才使用第三個參數

flag:打開標志

Linux操作文件的底層系統怎么調用

注意: 這些其實都是定義的一些宏,當需要使用到多個參數時,使用按位或“ | ”構成多個flag參數

也可跟隨下面的方式一起使用:

Linux操作文件的底層系統怎么調用

Linux操作文件的底層系統怎么調用

Linux操作文件的底層系統怎么調用

其他不一一介紹,需要使用時自查。

write()

Linux操作文件的底層系統怎么調用

返回值

  • 若成功為已經寫入的字節數;

  • 若出錯為-1;

注意:計劃寫入的字節數和函數的返回值不相等時,表示寫入出現了錯誤,可以用來檢驗寫入是否成功;

參數:

  • fd:寫入文件的文件描述符;

  • buf:存放待寫數據的緩存;

  • count:要求寫入一次數據的字節數;

注意:

對于普通文件,寫操作從文件的當前位移量處開始,若如果在打開該文件時,指定了O_APPEND選擇項,則在每次寫操作之前,將文件位移量設置在文件的當前結尾處。在一次成功寫之后,該文件位移量增加實際寫的字節數。

read()

Linux操作文件的底層系統怎么調用

返回值 :讀到的字節數

  • 若已到文件尾為0;若出錯為-1;

參數

  • fd:讀取文件的文件描述符;

  • buf:存放讀取數據的緩存;

  • count:要求讀取一次數據的字節數;注意返回值是實際讀到的字節數,二者并不相同;

注意:讀操作從文件的當前位移量開始,在成功返回之前,該位移量增加實際讀得的字節數(這個位移量是可以自己設置的);

close()

Linux操作文件的底層系統怎么調用

注意:當一個進程終止時,它所打開的文件都由內核自動關閉。

Linux操作文件的底層系統怎么調用

注:這些不帶緩存的函數都是內核提供的系統調用;這正是和我們在C語言中學到的那些IO操作不同的地方,他們不是標準C的組成部分,但是POSIX的組成部分。

標準C對文件操作時都是通過對FILE的結構體指針進行操作的,而這里使用的是文件描述符。

文件描述符的范圍是0——OPEN MAX,早期的Unix采用的上限為19(即允許每個進程打開20個文件),現在很多系統將即增加到63,Linux為1024,具體多少可以在的頭文件中查找。

Linux操作文件的底層系統怎么調用

Linux操作文件的底層系統怎么調用

文件描述符與文件指針

  • FILE *fdopen(int fd,const char *mode),將文件描述符轉為文件指針;

  • int fileno(FILE *stream),將文件指針轉換為文件描述符;

lseek函數

功能: 定位一個已打開的文件

off_t?lseek(int?fd,off_t?offset,int?whence);
  • fd:已經打開的文件描述符;

  • offset:位移量;

  • whence:定位的位置,即基準點

  • SEEK_SET:將該文件的位移量設置為距文件開始處offset個字節;

  • SEEK_CUR:將該文件的位移量設置為其當前值加offset,offset可正可負;

  • SEEK_END:將該文件的位移量設置為文件長度加offset,offset可正可負(此時若為正值,就涉及到空洞文件了,請看下面的講解);

  • 返回值:**若成功則返回新的文件位移量(絕對位移量)**若出錯為-1;定位到文件尾部時,可以返回文件的大小;

  • lseek函數也可以用來確定所涉及的文件是否可以設置位移量,如果文件描述符所引用的是一個管道或者FIFO,則lseek返回-1,并將errno設置為EPLPE;

空洞文件示例:

#include<stdio.h> #include<fcntl.h> #include<string.h> #include<stdlib.h> #include<unistd.h> #include<errno.h>  //生成空洞文件 char?*buffer?=?"0123456789";  int?main(int?argc,char?*argv[]) { 	if(argc?<p><img src="https://img.php.cn/upload/article/000/887/227/168415711686666.png" alt="Linux操作文件的底層系統怎么調用"></p> <p>我們可以看到用more命令查看文件內容時,發現顯示的內容只有一次寫入的結果,用od</p> <p>-c命令查看文件的ASSCI碼,我們會發現在兩次內容之間,有10個

精品人妻伦九区久久AAA片69|
综合久久精品色|
色综合久久久久|
99久久国产亚洲高清观看2024|
国产精品丝袜久久久久久不卡|
欧美久久一级内射wwwwww.|
午夜精品久久久久久99热|
国产精品久久久久久影院|
欧美一级久久久久久久大|
人妻少妇久久中文字幕|
久久综合九色综合久99|
久久国产亚洲精品麻豆|
97久久国产露脸精品国产|
国产精品成人无码久久久久久|
中文字幕乱码人妻无码久久|
91精品久久久久久无码|
亚洲中文字幕久久精品无码APP|
人人狠狠综合久久亚洲88|
亚洲午夜久久久久妓女影院|
久久久国产一区二区三区|
五月丁香综合激情六月久久|
欧美日韩中文字幕久久久不卡|
国产一久久香蕉国产线看观看|
99精品久久精品一区二区|
亚洲精品视频久久久|
一本大道久久a久久精品综合|
亚洲欧美日韩中文久久|
人妻精品久久久久中文字幕|
国产精品激情综合久久|
91久久精一区二区三区大全|
久久精品国产亚洲AV蜜臀色欲|
久久久久久极精品久久久|
伊人热人久久中文字幕|
久久久国产乱子伦精品作者|
亚洲国产精品无码成人片久久|
99蜜桃臀久久久欧美精品网站|
亚洲午夜无码AV毛片久久|
久久久久这里只有精品|
亚洲精品美女久久久久99小说
|
狠狠色丁香久久婷婷综合五月|
久久这里都是精品|