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個

狠狠色丁香久久婷婷综合|
久久久久无码精品国产app|
久久人人爽人人爽人人片av麻烦|
久久亚洲国产精品五月天婷|
久久久久亚洲AV成人网人人网站|
久久久无码精品亚洲日韩按摩
|
久久99热这里只频精品6|
伊人精品久久久久7777|
久久久久久亚洲Av无码精品专口|
99久久精品国产综合一区|
国产精品久久婷婷六月丁香|
久久er国产精品免费观看2|
中文字幕无码久久久|
久久婷婷久久一区二区三区|
国产精品久久久香蕉|
国产香蕉97碰碰久久人人|
欧美黑人激情性久久|
伊人久久亚洲综合影院|
亚洲国产成人久久精品影视|
99久久无色码中文字幕人妻|
久久久久久国产a免费观看不卡|
久久精品无码专区免费东京热|
一本一本久久a久久精品综合麻豆|
日产精品99久久久久久|
欧美亚洲日本久久精品|
99久久99久久精品国产片果冻|
久久久久亚洲AV无码麻豆|
久久综合色老色|
亚洲色欲久久久久综合网|
国产巨作麻豆欧美亚洲综合久久|
久久久av波多野一区二区|
香蕉久久av一区二区三区|
亚洲精品乱码久久久久久蜜桃不卡|
久久久久亚洲AV成人网人人网站|
久久国产精品-久久精品|
久久九九全国免费|
国产精品激情综合久久|
亚洲乱亚洲乱淫久久|
久久九九免费高清视频|
久久人人爽人人爽人人片AV东京热|
99久久精品午夜一区二区|