搜尋
首頁運維linux運維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

    :存放讀取資料的快取;

Linux操作檔的底層系統怎麼調用count

:要求讀取一次資料的位元組數;注意傳回值是實際讀到的位元組數,二者並不相同;############# ##注意:###讀取操作從檔案的###目前位移量###開始,在成功返回之前,該位移量增加實際讀取的位元組數(這個位移量是可以自己設定的); ######close()#############

注意:當一個行程終止時,它所開啟的檔案都會由核心自動關閉。

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 < 2)
	{
		fprintf(stderr,"-usage:%s [file]\n",argv[0]);
		exit(1);
	}

	int fd = open(argv[1],O_WRONLY | O_CREATE | O_TRUNC,0777);
	if(fd < 0)
	{
		perror("open error");
		exit(1);
	}

	size_t size = strlen(buffer) * sizeof(char);
	//将字符串写入到空洞文件中
	if(write(fd,buffer,size) != size)
	{
		perror("write error");
		exit(1);
	}
	
	//定位到文件尾部的10个字节处
	if(lseek(fd,10L;SEERK_END) < 0)
	{
		perror("lseek error");
		exit(1);
	}
	//从文件尾部的10个字节处再写入字符串
	if(write(fd,buffer,size) != size)
	{
		perror("write error");
		exit(1);
	}
	close(fd);
	return 0;
}

Linux操作檔的底層系統怎麼調用

我們可以看到用more指令查看文件內容時,發現顯示的內容只有一次寫入的結果,用od

-c指令查看文件的ASSCI碼,我們會發現在兩次內容之間,有10個\0,這就是空洞,用vim開啟該文件內容也可以看到,有10個^@符。

註:每個檔案都有一個與其相關聯的“當前檔案偏移量”,它是一個非負整數,用以度量從檔案開始計算的位元組數。通常讀寫操作都以檔案目前偏移量開始,並使得偏移量增加所讀或所寫的位元組數。按系統默認,當開啟一個檔案時,除非指定O_APPEND選擇項,否則該檔案位移量被設定為0;

範例:

Linux操作檔的底層系統怎麼調用

##運行結果如下:

Linux操作檔的底層系統怎麼調用

fd = 3的原因是:

系統內部PCB存在一個

檔案表 ,以記錄開啟的文件,文件描述符其實就是文件表的下標

Linux操作檔的底層系統怎麼調用

  • 0——FILE* stdin,標準輸入

  • 1——FILE* stdout,標準輸出

  • 3——FILE* stderr,標準錯誤輸出

  • #本程式已經預設開啟了三個文件,fd排到第四個,所以編號為3

#接下來進行文件讀取

Linux操作檔的底層系統怎麼調用

運行結果如下:

Linux操作檔的底層系統怎麼調用

#應用程式:利用讀寫對檔案進行複製

#首先宣告:我們不區分文字檔案還是二進位檔案

完成對一個圖片的複製,我們可以使用以下的方案:

  • 先開啟原來的二進位檔案

  • 開啟一個新的檔案

  • 從原來的二進位檔案讀取一部分寫入新檔案

  • 重複讀寫

  • 直到讀完,寫完就停止【read() == 0作為循環停止的條件,讀不到就是讀完】

  • #完成複製

Linux操作檔的底層系統怎麼調用

複製完成

Linux操作檔的底層系統怎麼調用

##開啟檔案後, fork的子進程能否共享和父進程共享存取同一個檔案?

Linux操作檔的底層系統怎麼調用

我們每次開啟文件以後,都會在核心中產生struct file這樣一個結構體,以表示開啟的文件,記錄著以下資訊:

  • 檔案偏移(起始從0開始,檔案指標隨著寫入資料進行偏移)

  • 引用計數(幾個行程正在使用這個打開的檔案)

  • inode節點(存放進程的屬性資訊:誰創建了,名字是什麼,在磁碟哪裡儲存。透過這個inode節點,我們才能找到對應的這個具體的檔案)

  • 開啟方式:例如只讀方式,只寫方式開啟

測試1:先開啟檔案再fork

Linux操作檔的底層系統怎麼調用

close(fd)寫在最外側,父子程序都會關閉,每關閉一次,引用計數減1,直到0。

運行結果如下:

Linux操作檔的底層系統怎麼調用

原因如下:

Linux操作檔的底層系統怎麼調用

測試2:先fork再開啟文件

修改程式碼後,運行結果發生以下變化:

Linux操作檔的底層系統怎麼調用

因為父子進程分開後,開啟了各自的文件,產生了各自的struct file,不再共享檔案偏移量。

在實際的應用場景中,我們更多地使用父進程打開的文件,子進程去訪問這種形式。

以上是Linux操作檔的底層系統怎麼調用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
Linux操作:利用維護模式Linux操作:利用維護模式Apr 19, 2025 am 12:08 AM

Linux的維護模式可以通過GRUB菜單進入,具體步驟為:1)在GRUB菜單中選擇內核並按'e'編輯,2)在'linux'行末添加'single'或'1',3)按Ctrl X啟動。維護模式提供了一個安全環境,適用於系統修復、重置密碼和系統升級等任務。

Linux:如何進入恢復模式(和維護)Linux:如何進入恢復模式(和維護)Apr 18, 2025 am 12:05 AM

進入Linux恢復模式的步驟是:1.重啟系統並按特定鍵進入GRUB菜單;2.選擇帶有(recoverymode)的選項;3.在恢復模式菜單中選擇操作,如fsck或root。恢復模式允許你以單用戶模式啟動系統,進行文件系統檢查和修復、編輯配置文件等操作,幫助解決系統問題。

Linux的基本要素:為初學者解釋Linux的基本要素:為初學者解釋Apr 17, 2025 am 12:08 AM

Linux的核心組件包括內核、文件系統、Shell和常用工具。 1.內核管理硬件資源並提供基本服務。 2.文件系統組織和存儲數據。 3.Shell是用戶與系統交互的接口。 4.常用工具幫助完成日常任務。

Linux:看看其基本結構Linux:看看其基本結構Apr 16, 2025 am 12:01 AM

Linux的基本結構包括內核、文件系統和Shell。 1)內核管理硬件資源,使用uname-r查看版本。 2)EXT4文件系統支持大文件和日誌,使用mkfs.ext4創建。 3)Shell如Bash提供命令行交互,使用ls-l列出文件。

Linux操作:系統管理和維護Linux操作:系統管理和維護Apr 15, 2025 am 12:10 AM

Linux系統管理和維護的關鍵步驟包括:1)掌握基礎知識,如文件系統結構和用戶管理;2)進行系統監控與資源管理,使用top、htop等工具;3)利用系統日誌進行故障排查,借助journalctl等工具;4)編寫自動化腳本和任務調度,使用cron工具;5)實施安全管理與防護,通過iptables配置防火牆;6)進行性能優化與最佳實踐,調整內核參數和養成良好習慣。

了解Linux的維護模式:必需品了解Linux的維護模式:必需品Apr 14, 2025 am 12:04 AM

Linux維護模式通過在啟動時添加init=/bin/bash或single參數進入。 1.進入維護模式:編輯GRUB菜單,添加啟動參數。 2.重新掛載文件系統為讀寫模式:mount-oremount,rw/。 3.修復文件系統:使用fsck命令,如fsck/dev/sda1。4.備份數據並謹慎操作,避免數據丟失。

Debian如何提升Hadoop數據處理速度Debian如何提升Hadoop數據處理速度Apr 13, 2025 am 11:54 AM

本文探討如何在Debian系統上提升Hadoop數據處理效率。優化策略涵蓋硬件升級、操作系統參數調整、Hadoop配置修改以及高效算法和工具的運用。一、硬件資源強化確保所有節點硬件配置一致,尤其關注CPU、內存和網絡設備性能。選擇高性能硬件組件對於提升整體處理速度至關重要。二、操作系統調優文件描述符和網絡連接數:修改/etc/security/limits.conf文件,增加系統允許同時打開的文件描述符和網絡連接數上限。 JVM參數調整:在hadoop-env.sh文件中調整

Debian syslog如何學習Debian syslog如何學習Apr 13, 2025 am 11:51 AM

本指南將指導您學習如何在Debian系統中使用Syslog。 Syslog是Linux系統中用於記錄系統和應用程序日誌消息的關鍵服務,它幫助管理員監控和分析系統活動,從而快速識別並解決問題。一、Syslog基礎知識Syslog的核心功能包括:集中收集和管理日誌消息;支持多種日誌輸出格式和目標位置(例如文件或網絡);提供實時日誌查看和過濾功能。二、安裝和配置Syslog(使用Rsyslog)Debian系統默認使用Rsyslog。您可以通過以下命令安裝:sudoaptupdatesud

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器