LINUX下通過系統呼叫的檔案操作

2021-07-25 15:24:24 字數 2694 閱讀 9822

相比較標準庫函式(fopen、fread、fwrite…)的方式,系統呼叫的方式只能在類unix系統下使用,而且,使用系統呼叫是不帶緩衝機制的。

①.完全緩衝:只有資料超過緩衝區大小時才進行真正的讀寫操作,比如fread,fwrite函式就是完全緩衝。正常情況下指定讀多少位元組就讀多少位元組;

②.行緩衝:當資料為換行符的時候進行一次真正的讀寫操作,比如標準io就是行緩衝,一般涉及到終端就是行緩衝的形式;

③.無緩衝:即不對字元進行快取操作,標準錯誤輸出和系統呼叫的讀寫函式就是無緩衝的。

從描述可以看出來,無緩衝一般是比較緊急的,但是因為io速度比cpu實際執行速度慢,效率會比較低。完全緩衝讀滿後一次性操作,效率就高了, 但是在緩衝區還有資料分時候程式直接停止就可能導致緩衝區內的資料丟失。

系統呼叫是對檔案描述符(int型別)進行操作的(相對應的是標準庫函式是對檔案指標(file*)進行操作的)

1.開啟檔案:

當程式執行時,會有三個檔案是預設開啟的,分別是:標準輸入(0)、標準輸出(1)、標準錯誤輸出(2)。

linux下乙個程序預設最多可開啟1024個檔案,實際上由於linux把其他裝置也當成檔案,比如管道、套接字的描述符也會占用檔案描述符。不用的檔案就要及時關掉。

open函式:int open(const char* pathname, int flags);

int open(const char* pathname, int flages, mode_t mode);

其中path:檔案的路徑以及檔名

flags取值:o_rdonly(唯讀)或o_wronly(只寫)或o_rdwr(可讀可寫) 也可以對這幾個值進行位或表示增加這幾個選項

mode建立檔案時選擇檔案許可權,和chmod的選項一樣。

函式返回值為檔案描述符。

2.建立檔案:

int  creat(const char * pathname, mode_t mode);

3.關閉檔案:

int close(int fd);

4.讀取檔案:

ssize_t read(int fd, void* buf, size_t count);

fd:檔案描述符,buf緩衝區指標,count讀取的位元組數;返回值為讀取到的位元組數

5.寫入檔案:

ssize_t write(itn fd,void* buf, size_t count);

引數設定與返回值和讀取函式類似

6.檔案定位:

off_t lseek(int fd, off_t offset, int whence);

fd:檔案描述符,offset:偏移的位元組數,可為負,whence:seek_set(檔案開頭)seek_cur(當前位置)seek_end(檔案結尾)

函式功能:將當前位置從whence移動offset個位元組,返回值是新的檔案偏移量

可以移到檔案結尾後面去,然後在再寫入資料,就會在原檔案結尾處和寫入資料處形成乙個資料為0的「空洞」

也可以將位置移到檔案尾,根據返回值得到該檔案的大小。

7.複製檔案描述符:

①:程序中有乙個程序檔案表通過記錄檔案描述符記錄當前程序開啟了哪些檔案;檔案描述符在核心中對應乙個核心檔案表,記錄了當前位置等資訊;核心檔案表指向i結構表,i結構表記錄了檔案的長度、所有者、在硬碟的位置等資訊。

②:同乙個程序中不同的檔案描述符指向不同的核心檔案表;

不同程序中如兩個檔案描述符指向同乙個檔案則它們各自指向了自己的核心檔案表,核心檔案表指向了同乙個i結構表;

複製檔案描述符可以讓兩個檔案描述符指向同乙個核心檔案;

函式:int dup(int oldfd); 傳入舊檔案描述符,返回新檔案描述符

int dup2(int oldfd, int newfd); 傳入舊檔案描述符和指定的新檔案描述符

由以上可以知道,複製後的檔案描述符和舊檔案描述符實際上指的是同乙個核心檔案表,就是說當檔案變化時兩個檔案描述符指向的核心都即時的發生了變化,即他們共享了檔案位置等資訊。

1.刪除檔案:

int unlink(const char *pathname);刪除pathname

目錄下的檔案其實就是該目錄下有指標指向了檔案在磁碟中的位置,刪除檔案就是講指向該檔案的鍊錶結點刪除。

2.讀取目錄:

①.開啟目錄:dir* opendir(const char* name);

返回值是乙個指向dir結構體的指標,用於讀取目錄資料。失敗返回null

②.讀取目錄下的檔案:struct dirent* readdir(dir* dirp)

返回乙個目錄項的資訊,包括檔案的inode節點號和檔名,目錄指標指向下乙個目錄項;

③:關閉目錄:int close(dir* dirp);

編譯器有幾個內建的巨集可以比較方便的得到當前的檔案資訊;

比較重要的就是檔名:__file__;

行號:__line__;

還有幾個在這個鏈結裡有說明:如何獲取當前檔案資訊

Linux下系統呼叫訪問檔案

linux 的檔案操作有兩種方式 linux系統呼叫方式,這種方式依賴於linux系統 c語言的檔案操作,採用c語言的庫函式實現。以下是linux系統呼叫方式 1.建立檔案 intcreat const char filename,mode t mode filename 要建立的檔名,包含路徑,預...

Linux下系統呼叫實現檔案操作

系統呼叫 系統呼叫是作業系統提供給使用者程式的一組 特殊 函式介面,使用者通過這組介面獲得作業系統提供的服務 中操作i o的函式,都是針對檔案描述符的。通過檔案描述符可以直接對相應檔案進行操作,如 open close write read ioctl define stdin fileno 0 標...

了解linux下的系統呼叫

計算機系統的各種硬體資源是有限的,在現代多工作業系統上同時執行的多個程序都需要訪問這些資源,為了更好的管理這些資源程序是不允許直接操作的,所有對這些資源的訪問都必須有作業系統控制。也就是說作業系統是使用這些資源的唯一入口,而這個入口就是作業系統提供的系統呼叫。系統呼叫是屬於作業系統核心的一部分的,必...