課題 Linux檔案操作總結

2021-10-31 22:03:24 字數 4857 閱讀 1928

檔案是linux中的乙個重要概念。在linux中,一切(幾乎一切)都是檔案。簡單的說,c中基本的的printf()函式,scanf()函式,其實都屬於檔案操作。

對於檔案操作,雖然都是通過函式呼叫的方式實現,卻還是能分為兩類:系統呼叫和庫函式。

這篇文章將先介紹linux中檔案的概念,系統呼叫和庫函式的概念 ,然後具體的討論兩種方式下的檔案操作。

博文的主要內容如下:

1. linux 中的檔案

2. 檔案訪問-庫函式

3. 檔案訪問-系統呼叫

4. 庫函式

5. 標準 i/o 庫

6. /proc檔案系統

1 linux中的檔案

按照普通的定義,檔案不過是一堆資料,在往下說,就是儲存器中的0101。。。而我們這裡討論的檔案有了更廣的定義。對於linux中的檔案,我的理解是:

linux中的檔案具有的特點是:可通過作業系統或者程式對外提供資訊,也能對內輸入資訊,可以被建立,刪除。

linux中,檔案有特別重要的意義,他們為作業系統和裝置提供了乙個簡單而統一的介面。在linux中,幾乎一切都可以看做是檔案 。

這就意味著,普通程式完全可以像使用檔案(普通定義)那樣使用磁碟檔案、序列口、印表機和其他裝置。

硬體裝置在linux作業系統中也被表示為檔案。例如,可以通過如下命令把cd-rom驅動器掛載為乙個檔案,

#mount -t iso9660 /dev/hdc /mnt/cdrom

#cd /mnt/rom

然後,就能像訪問普通檔案那樣在cd-rom目錄中漫遊。

和操作一般意義上的檔案一樣,linux中對檔案的操作只需要五個基本的函式:

open、close、read、write和ioctl

通過呼叫這幾個函式就能對linux中的檔案進行讀、寫等操作。不過,這種操作又分為系統呼叫和庫函式呼叫。簡單的說,系統呼叫是最直接的方式,

庫函式呼叫最終也是通過系統呼叫實現的。可認為庫函式呼叫是對系統調出於效率考慮而做出的優化。

庫函式呼叫和系統呼叫的區別和聯絡請參看:linux系統呼叫和庫函式呼叫的區別

我們用很少的函式就可以對檔案和裝置進行訪問和控制。這些函式就是所謂的系統呼叫,由作業系統直接提供,他們是通向作業系統本身的介面。

作業系統的核心部分,既核心,其實就是一組裝置驅動程式。這是一些對硬體進行控制的介面。

2 檔案訪問-系統呼叫

通過系統呼叫來訪問檔案是最直接的方式。系統呼叫函式直接作用於作業系統核心的裝置驅動程式從而實現檔案訪問。

在系統中需要處理的檔案(讀、寫操作)需要乙個標識,以便在其它地方能識別出這個檔案,於是就產生了檔案描述符。檔案描述符是一些小值整數,簡單的說就是

乙個檔案id用於在系統中唯一的標識檔案。檔案描述符的總數也就是系統可以開啟檔案的最多個數,這取決於系統的配置情況。

當開始執行程式時,也就是系統開始執行時,它一般會有三個已經開啟的檔案描述符。他們是:

0:標準輸入

1:標準輸出

2:標準錯誤

其它檔案的檔案描述符,在呼叫檔案開啟函式open時返回。這就是說,每個裝置對應著乙個檔案描述符。檔案描述符由作業系統分配,每次分配最小的。

write,就是把緩衝區的資料寫入檔案中。注意,這裡的檔案時廣泛意義的檔案,比如寫入磁碟、寫入印表機等等。

linux 中write()的函式原型:

size_t write(int fildes, const void *buf, size_t nbytes);

引數說明:

fildes:檔案描述符,標識了要寫入的目標檔案。例如:fildes的值為1,就像標準輸出寫資料,也就是在顯示屏上顯示資料;如果為 2 ,則想標註錯誤寫資料。

*buf:待寫入的檔案,是乙個字串指標。

nbytes:要寫入的字元數。

函式返回值:size_t 返回成功寫入檔案的字元數。需要指出的是,write可能會報告說他寫入的位元組比你所要求的少。這並不一定是個錯誤。在程式中,你需要檢查

error已發現錯誤,然後再次呼叫write寫入剩餘的資料。

請看下面的例子:

執行結果:

這個程式只在標準輸出上顯示一條訊息。

系統呼叫read是從檔案中讀出資料。要讀取的檔案用檔案描述符標識,資料讀入乙個事先定義好的緩衝區。他返回實際讀入的位元組數。

linux中read的函式原型:

size_t read(int fildes, void *buf, size_t nbytes);

引數說明:

fildes:檔案描述符,標識要讀取的檔案。如果為0,則從標準輸入讀資料。類似於scanf()的功能。

*buf:緩衝區,用來儲存讀入的資料。

nbytes:要讀取的字元數。

返回值:size_t返回成功讀取的字元數,它可能會小於請求的位元組數。

執行結果:

系統呼叫open的作用是開啟乙個檔案,並返回這個檔案的描述符。

簡單地說,open建立了一條到檔案或裝置的訪問路徑。如果操作成功,它將返回乙個檔案描述符,read和write等系統呼叫使用該檔案描述符對檔案或

裝置進行操作。這個檔案描述符是唯一的,他不會和任何其他執行中的程序共享。如果兩個程式同時開啟乙個檔案,會得到兩個不同的問價描述符。如果

同時對兩個檔案進行操作,他們各自操作,互補影響,彼此相互覆蓋(後寫入的覆蓋先寫入的)為了防止檔案按讀寫衝突,可以使用檔案鎖的功能。這不是

本次重點,以後介紹。

linux中open的函式原型有兩個:

int open(const char *path, int oflags);

int open(const char *path, int oflags, mode_t mode );

引數說明。

path:準備開啟的檔案或裝置名字。

oflags:指出要開啟檔案的訪問模式。open呼叫必須指定如下所示的檔案訪問模式之一:

open呼叫哈可以在oflags引數中包括下列可選模式的組合(用」按位或「操作):

o_appedn: 把寫入資料追加在檔案的末尾。

o_trunc: 把檔案長度設為零,丟棄以後的內容。

o_creat: 如果需要,就按引數mode中給出的訪問模式建立檔案。

o_excl: 與o_creat一起呼叫,確保呼叫者建立出檔案。使用這個模式可防止兩個程式同時建立乙個檔案,如果檔案已經存在,open呼叫將失敗。

關於其他可能出現的oflags值,請看考open的呼叫手冊。

mode:

當使用哦、o_creat標誌的open來建立檔案時,我們必須使用三個引數格式的open呼叫。第三個引數mode 是幾個標誌按位or後得到的。他們是:

s_irusr: 讀許可權,檔案屬主。

s_iwusr:寫許可權,檔案屬主。

s_ixusr:執行許可權,檔案屬主。

s_irgrp:讀許可權,檔案所屬組。

s_iwgrp:寫許可權,檔案所屬組。

。。。。

請看下面例子:

open("myfile", o_creat, s_irusr|s_ixoth ;

他的作用是建立乙個名為myfile 的檔案,檔案屬主擁有讀許可權,其他使用者擁有執行許可權,且只有這些許可權。

執行結果:

程式建立了乙個名為myfile的檔案,檔案屬主有讀許可權,其他使用者有執行許可權,且只有這些許可權。

close系統呼叫用於「關閉」乙個檔案,close呼叫終止乙個檔案描述符fildes以其檔案之間的關聯。檔案描述符被釋放,並能夠重新使用。

close成功返回1,出錯返回-1.

#include

int close(int fildes);

ioctl提供了乙個用於控制裝置及其描述符行為和配置底層服務的介面。終端、檔案描述符、甚至磁帶機都可以又為他們定義的ioctl,具體

細節可以參考特定裝置的使用手冊。

下面是ioctl 的函式原型

#include

int ioctl(int fildes, int cmd,,,,,,);

ioctl對描述符fildes指定的物件執行cmd 引數中所給出的操作。

還有許多其他的系統呼叫能對檔案進行操作。

幾個常用的如:lseek()對檔案描述符fildes指定檔案的讀寫指標進行設定,也就是說,它可以設定檔案的下乙個讀寫位置。

fstat,stat,lstat 是和檔案描述符相關的函式操作,這裡就不做介紹。

dup,dup2系統呼叫。dup提供了複製檔案描述符的方法,使我們能夠通過兩個或者更多個不同的檔案描述符來訪問同乙個檔案。這可以用於

在檔案的不同位置對資料進行讀寫。

4 庫函式

在輸入、輸出操作中,直接使用系統呼叫效率會非常底。具體原因有二:

系統呼叫會影響系統效能。與函式呼叫相比,系統呼叫的開銷大。因為在執行系統呼叫的時候,要切換到核心**區執行,然後再返回使用者**。

這必然就需要大量的時間開支。一種解決辦法是:儘量減少系統呼叫的次數,讓每次系統呼叫完成盡可能多的任務。

例如每次系統呼叫寫入大量的字元而不是單個字元。

硬體會對系統呼叫一次能讀寫的資料塊做一定的限制。例如,磁帶機通常的寫運算元據塊長度是10k,如果縮寫資料不是10k的整數倍,磁帶機還是會以10k為單位繞磁帶,這就在磁帶上留下空隙。

為了提高檔案訪問操作的效率,並且使得檔案操作變得更方便,linux發行版提供了一系列的標準函式庫。他們是一些由函式構成的集合,你可以在自己的程式方便的中使用它們,

去操作檔案。提供輸出緩衝功能的標準i/o庫就是這樣的例子。你可以高效的寫任意長度的資料塊,庫函式則在需要的時候安排底層函式呼叫(系統呼叫)

也就是說,庫函式在使用者和系統之間,增加了乙個中間層。如下圖所示:

庫函式是根據實際需要而包裝好的系統呼叫,使用者可在程式中方便的使用庫函式,如標準i o庫(稍後會講)

5 標準i/o庫

標準i/o庫及其標頭檔案為底層i/o系統呼叫提供了乙個通用的介面。這個庫現在已經成為ansi標準c的一部分,而前面所講的系統呼叫卻不是。

Linux檔案操作總結

檔案是linux中的乙個重要概念。在linux中,一切 幾乎一切 都是檔案。簡單的說,c中基本的的printf 函式,scanf 函式,其實都屬於檔案操作。對於檔案操作,雖然都是通過函式呼叫的方式實現,卻還是能分為兩類 系統呼叫和庫函式。這篇文章將先介紹 中檔案的概念,系統呼叫和庫函式的概念 然後具...

Linux面試經常問的檔案系統操作命令

1.cat 可以顯示檔案的內容 經常和more搭配使用 或將多個檔案合併成乙個檔案。2.chgrp 用來改變檔案或目錄所屬的使用者組,命令的引數以空格分開的要改變屬組的檔案列表,檔名支援萬用字元,如果使用者不是該檔案的所有者,則不能改變該檔案的所屬組。3.chmod 用於改變檔案或目錄的訪問許可權,...

Linux 作業系統 基礎操作 教學

福州大學資訊學院計算機系劉延華 2003.2 目錄前言 2 第一講 linux基礎 2 一 什麼是linux?2 二 安裝linux的好處?3 三 如何得到linux?3 四 如何得到linux的最新訊息?3 五 linux作業系統上有什麼應用?4 六 在那裡可以找到討論區?5 七 安裝過程 5 第...