unix/linux為作業系統把服務和裝置都抽象成了檔案,並提供了一套簡單而統一的介面,這部分介面就是檔案讀寫。也就是說unix/linux系統中的任何物件都可以被當作某種特殊的檔案,以檔案的形式訪問。
檔案分類
目錄檔案、裝置檔案、socket檔案、管道檔案、普通檔案、鏈結檔案
檔案相關的系統呼叫
#include
#include
#include
int open(const char *pathname, int flags);
功能:開啟檔案
pathname:檔案的路徑
flags:開啟檔案的方式
o_rdonly 唯讀
o_wronly 只寫
o_rdwr 讀寫
o_creat 檔案不存在則建立
o_excl 如果檔案存在則建立失敗
o_trunc 如果檔案存在則清空
o_ndelay 非阻塞,開啟檔案後的操作以非阻塞模式進行。
o_sync 同步,寫入資料後等待資料被寫入到底層硬體後才返回。
o_async 非同步,當檔案可讀/寫時向呼叫的程序傳送訊號sigio。
返回值:檔案描述符,類似於標準庫的file*,代表乙個開啟的檔案。
int open(const char *pathname, int flags, mode_t mode);
功能:建立檔案
flags:o_create
mode:
s_irwxu 00700 擁有者 讀寫執行許可權
s_irusr 00400 擁有者 讀
s_iwusr 00200 擁有者 寫
s_ixusr 00100 擁有者 執行
s_irwxg 00070 同組 讀寫執行許可權
s_irgrp 00040 同組 讀
s_iwgrp 00020 同組 寫
s_ixgrp 00010 同組 執行
s_irwxo 00007 其它 讀寫執行許可權
s_iroth 00004 其它 讀
s_iwoth 00002 其它 寫
s_ixoth 00001 其它 執行
int creat(const char *pathname, mode_t mode);
功能:建立檔案
mode:同open
#include
ssize_t write(int fd, const void *buf, size_t count);
功能:把記憶體中的資料寫入檔案中
fd:檔案描述符,也就是open的返回值。
count:要寫入的位元組數
返回值:成功寫入的位元組數
ssize_t read(int fd, void *buf, size_t count);
功能:從檔案中讀取資料到記憶體
fd:檔案描述術,也就是open的返回值。
count:想讀取的位元組數
返回值:實際讀取到的位元組數
int close(int fd);
功能:關閉檔案
返回值:成功返回0,失敗返回-1。
使用標準io比直接使用系統io更快,原因標準io有緩衝區,在寫資料時並不是直接呼叫系統io,而先把緩衝區填滿,然後再呼叫系統io定入資料到檔案。
而直接使用系統io會返回切換使用者態和記憶體態,更加耗時,當我們給系統io也增加個更大的緩衝區時,它的速度會比標準io更快。
標準io > 系統io
系統io+緩衝區 > 標準io
標準io
int fseek(file *stream, long offset, int whence);
返回值:成功返回0,失敗返回-1。
系統io
off_t lseek(int fd, off_t offset, int whence);
fd:檔案描述術,也就是open的返回值。
offset:偏移值
whence:基礎位置
seek_set 檔案開頭
seek_cur 當前位置
seek_end 檔案末尾
返回值:調整後的檔案位置指標所在的位置。
在越過檔案末尾的位置寫入資料將形成空洞,空洞會計算在檔案大小中,但不占用磁碟空間。
物件 sprintf 轉換成 字串 然後再定入檔案
按字串形式讀取,使用sscanf 轉換成對應再使用。
檔案描述符:
1、非負整數,代表開啟的檔案。
2、由系統呼叫返回(open)返回,可以被核心空間引用。
3、它代表著乙個核心物件(就相當於file對像),因為記憶體不能暴露它的記憶體位址,
因此不能返回乙個物件指標。
4、核心中有一張表記錄所有開啟的檔案物件,檔案描述符就是訪問這張表的下標,
因此檔案描述也叫控制代碼,訪問物件指標的憑證。
核心中有三個預設開啟的檔案描述符:
0 標準輸入 stdin
1 標準輸出 stdout
2 標準錯誤 stderr
檔案描述符的複製:
int dup(int oldfd);
功能:複製乙個已經開啟的檔案描述符
返回值:返回乙個當前沒有用過的最小的檔案描述符
int dup2(int oldfd, int newfd);
功能:複製乙個指定的檔案描述符
newfd:想要複製的檔案描述符,如果已經被開啟,則先關閉再複製。
注意:複製成功後,相當於兩相檔案描述符對就乙個開啟的檔案。
linux 檔案I O 程式設計
1.基本操作 include include include open fd open tmp hello.c o wronly o creat,0600 close close fd read read fd,buf,len write write fd,buf,len lseek off t l...
linux程式設計之檔案I O
linux下c語言對於檔案的操作,我們會經常用到fopen fclose fwrite fread fgets 等一系列庫函式,基本和是和windows下學習c語言一樣的,其實這些庫函式就是在linuxx下對系統呼叫函式的封裝,因此這裡只介紹系統函式下的檔案操作函式。一 open 開啟檔案 incl...
Linux學習 檔案I O程式設計
在linux中,為了保護核心空間,將程式的執行空間分為核心空間和使用者空間,核心態和使用者態 他們執行在不同的級別上,在邏輯上是相互隔離的,因此使用者程序在通常情況下不允許訪問核心資料,也無法使用核心函式,他們只能在使用者空間操作使用者資料,呼叫使用者空間的函式,作業系統為使用者提供了兩個介面 1....