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()——打開或者創建一個文件
返回值類型: int——文件描述符fd,每打開一個文件,就會得到一個文件描述符,這個文件描述符是整形的,我們通過文件描述符進行讀寫操作。
-
失敗:-1
-
成功:>= 0,即文件描述符;
-
mode_t是一個類型別名,實際上就是一個有符號的整數,對open函數而言,僅僅當創建新文件時才使用第三個參數
flag:打開標志
注意: 這些其實都是定義的一些宏,當需要使用到多個參數時,使用按位或“ | ”構成多個flag參數
也可跟隨下面的方式一起使用:
其他不一一介紹,需要使用時自查。
write()
返回值:
-
若成功為已經寫入的字節數;
-
若出錯為-1;
注意:計劃寫入的字節數和函數的返回值不相等時,表示寫入出現了錯誤,可以用來檢驗寫入是否成功;
參數:
-
fd:寫入文件的文件描述符;
-
buf:存放待寫數據的緩存;
-
count:要求寫入一次數據的字節數;
注意:
對于普通文件,寫操作從文件的當前位移量處開始,若如果在打開該文件時,指定了O_APPEND選擇項,則在每次寫操作之前,將文件位移量設置在文件的當前結尾處。在一次成功寫之后,該文件位移量增加實際寫的字節數。
read()
返回值 :讀到的字節數
-
若已到文件尾為0;若出錯為-1;
參數
-
fd:讀取文件的文件描述符;
-
buf:存放讀取數據的緩存;
-
count:要求讀取一次數據的字節數;注意返回值是實際讀到的字節數,二者并不相同;
注意:讀操作從文件的當前位移量開始,在成功返回之前,該位移量增加實際讀得的字節數(這個位移量是可以自己設置的);
close()
注意:當一個進程終止時,它所打開的文件都由內核自動關閉。
注:這些不帶緩存的函數都是內核提供的系統調用;這正是和我們在C語言中學到的那些IO操作不同的地方,他們不是標準C的組成部分,但是POSIX的組成部分。
標準C對文件操作時都是通過對FILE的結構體指針進行操作的,而這里使用的是文件描述符。
文件描述符的范圍是0——OPEN MAX,早期的Unix采用的上限為19(即允許每個進程打開20個文件),現在很多系統將即增加到63,Linux為1024,具體多少可以在
文件描述符與文件指針
-
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小说 | 狠狠色丁香久久婷婷综合五月| 久久这里都是精品|