linux不帶緩衝檔案IO

2021-06-10 20:23:37 字數 2136 閱讀 3976

本博文設計的io不屬於ansi c的檔案io,所涉及的每乙個函式都是乙個系統呼叫。主要涉及posix.1的不帶快取的io操作的基礎部分。

在linux核心中,對於乙個檔案的描述只需要乙個標示符即可。而不是乙個複雜的指標,僅僅是乙個int型的整數,有檔案描述符可以直接通過系統api直接操作核心資源,換句話說,下面的所有操作api都會產生乙個系統呼叫。這樣說來,int的大小就限制了作業系統可以開啟的最大檔案數。但是檔案開啟上限主要受open_max限制

這個檔案的概念是linux核心的檔案概念,它包括檔案目錄裡面的具體檔案,sock,管道,串列埠等一系列可以看做檔案操作的集合

其中常用的檔案描述符0,1,2分別表示stdin_fileno, stdout_fileno, stderr_fileno。在檔案中定義

這是乙個開啟檔案的函式

#include #include #include int open(const char *filename, int flags, /*, mode_t mode */);

其中flag是檔案狀態標記,由下面引數或運算構成(定義在fcntl.h):

o_rdonly

o_wronly

o_rdwr

o_creat:只有有這乙個引數的時候open函式才需要呼叫第三個引數,指明許可權

o_excl:如果檔案存在,則出錯

o_trunc:如果檔案存在則截斷為0

o_noctty

o_nonblock:非阻塞,

o_sync:每次write都等物理成功寫入

成功返回檔案描述符,否則返回負數

有了open函式就不太需要create函式了。因為可以由o_reat建立檔案。

#include #include #include int create(const char *filename, mode_t mode);
出錯返回-1

這是一耳光關閉檔案的函式

#include int close(int fd);
出錯返回-1

關閉乙個開啟的檔案。同時釋放該檔案的所有記錄鎖

需要說明的是,當程序退出時,會隱式的關閉本程序開啟的檔案

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

出錯返回-1,成功返回新的偏移量。

對於offset的解釋與最後乙個引數whence(何處)有關:

seek_set,從開始位置計算,offset不能為負數

seek_cur,從當前位置計算,offset可以為正為負

seek_end,從最後位置計算,offset可以為正為負

注意:檔案偏移量是每個程序獨有的,不同的程序開啟同乙個檔案,但是可以有不同的檔案偏移量。

從檔案中讀取資料

#include ssize_t read(int fd, void *buffer, size_t nbytes);成功返回讀取到的位元組數,不一定等於nbytes,出錯返回-1,到達檔案尾返回0
向檔案中寫入資料

#include ssize_t write(int fa, void *buffer, size_t nbytes);

成功返回已經寫入的位元組數,出錯返回-1

這兩個函式可以用來複製乙個檔案描述符(file description)

#include int dup(int fd);

int dup2(int fd1, int fd2);

成功返回新的檔案描述符,出錯返回-1

這兩個函式的區別是:

dup複製fd返回乙個可用的最小檔案描述符;

dup2用檔案描述符fd2來複製fd1,如果fd2已經開啟,那麼先將其關閉。

複製之後的檔案描述符共享檔案表項,表現為擁有一樣檔案狀態標記和檔案偏移量

這個函式可以改變已經開啟的檔案的性質

#include #include #include int fcntl(int fd, int cmd  /*,int arg*/);

成功依賴cmd,出錯返回-1

fcntl有五種功能

fcntl功能非常強大,應該根據需要,在具體環境程式設計中使用,熟記

這個不是很熟悉,略

檔案I O(不帶緩衝)概述

unix系統中大多數檔案i o只需用到5個函式 open read write lseek以及close。這些函式經常被稱為不帶緩衝的i o unbuffered i o 術語不帶緩衝指的是每個read和write都呼叫核心中的乙個系統呼叫。這些不帶緩衝的i o函式不是iso c的組成部分,但是,它...

不帶緩衝的I O

unix系統中的大多數檔案i o只需要用到5個函式 open read write lseek以及close。這些函式經常被稱為不帶緩衝的i o。術語 不帶緩衝 指的是每個read和write都呼叫核心中的乙個系統呼叫。檔案描述符 對於核心而言,所有開啟的檔案都通過檔案描述符引用。檔案描述符是乙個非...

檔案I O(不帶緩衝)之I O的效率

程式清單3 3中的程式使用read和write函式複製檔案。關於該程式應注意下列各點 它從標準輸入讀,寫至標準輸出,這就假定在執行本程式之前,這些標準輸入 輸出已由shell安排好。確實,所有常用的unix系統shell都提供一種方法,它在標準輸入上開啟乙個檔案用於讀,在標準輸出上建立 或重寫 乙個...