最近剛剛回國, 因為疫情的緣故在上海隔離. 閒來無事,想要複習複習linux的相關知識, 最近看到了關於檔案的i/o操作, 特來此記錄一下, 以後忘記了也能看看.
linux下的i/o 操作比較常用的有4個函式, 分別是: open(), read(),write(),close.()和windows下的fopen()之類的函式相似.
函式原型如下:
#include
#include
//函式原型
intopen
(const
char
* pathname,
int flags,..
./*mode_t mode*/);
//returns file descriptor on success, or -1 on error
顧名思義, 這個函式是用來開啟檔案的,當檔案開啟成功時, 會返回乙個int型檔案描述符,以便後面的read(),write()使用.
現在讓我們來分析分析其中的引數:
pathname : 檔名稱或者是路徑
flags: 這個引數意味著訪問檔案的模式,
第三個引數可有可無: 如果你要訪問的檔案不存在的話, 可以在flags(第二個引數)使用o_create建立乙個, 建立之後需要對該檔案的一些訪問許可權進行初始化, 這第三個引數就是用來設定檔案的訪問許可權的.
下面來看一下都有些什麼標誌(flags):
標誌用途
o_rdonly
以唯讀的方式開啟
o_wronly
以只寫的方式開啟
o_rdwr
以讀寫的方式開啟
o_cloexec
設定 close-on-exec 標誌
o_creat
若檔案不存在則建立之
o_direct
無緩衝的輸出/輸出
o_directory
如果pathname不是目錄, 則失敗
o_excl
結合o_creat引數使用, 專門用於建立檔案
o_largefile
在32位系統中使用此標誌開啟大檔案
o_noatime
呼叫read()時,不修改檔案最近訪問的時間
o_noctty
不要讓pathname成為控制終端
o_nofollow
對符號鏈結不予解引用
o_trunc
截斷已有檔案,使其長度為零
總在檔案尾部追加資料
o_async
當i/o操作可行時,產生訊號同志程序
o_dsync
提供同步的i/o資料完整性
o_nonblock
以非阻塞方式開啟
o_sync
以同步方式寫入檔案
下面介紹一下第三個引數中的可選項
標誌語義
s_irusr
使用者可讀
s_iwusr
使用者可寫
s_irgrp
使用者組可讀
s_iwgrp
使用者組可寫
s_iroth
其他人可讀
s_iwoth
其他人可寫
上面的選項挑著用就行了, 我一般時這麼寫的:
mode_t open_perms = s_irusr|s_iwusr|s_irgrp|s_iroth|
;//--rw-r-r
函式原型如下:
#include
//函式原型
ssize_t read
(int fd,
void
*buffer, size_t count)
;//returns number of bytes read, 0 on eof, or -1 on error
這個函式可以讀取檔案中的資料, 並且將資料儲存在buffer中,以供使用.
並且這個函式會反悔讀取了多少的位元組數.
分析一下引數:
fd: open()函式返回的檔案描述符.
buffer: 檔案中的資料將被儲存在這裡.
count: 限制了一次讀取多少字元,這與buffer的大小有關.
#include
//函式原型
ssize_t write
(int fd,
void
*buffer, size_t count)
;//returns number of bytes written, or -1 on error
write的呼叫與read類似,只不過是將讀取的buf寫入到檔案中罷了.
分析一下引數:
fd: open()函式返回的檔案描述符.
buffer: buffer引數為要寫入檔案中資料的記憶體位址.
count: 為欲從buffer寫入檔案的資料自己數.
函式原型:
#include
intclose
(int fd)
;//returns 0 on success, or -1 on error
關閉檔案,沒什麼可說的
函式原型:
#include
off_t lseek
(int fd, off_t offset,
int whence)
;//returns new file offset if successful, or -1 on error
這個函式是用來指定檔案偏移量的。
對於每個開啟的檔案, 系統核心會記錄其檔案偏移量。檔案偏移量是指執行下乙個read()或write()操作的檔案起始位置,會以相對於檔案頭部起始點的檔案當前位置來表示。檔案第乙個位元組的偏移量為0.
如果程式的檔案偏移量依然跨越檔案結尾, 然後再執行i/o操作, 將會發生什麼情況呢?
read()呼叫將會反回0, 表示檔案結尾. 從檔案結尾後到新寫入資料見的這段空間被稱為檔案空洞. 從程式設計的角度來看,檔案空洞中是存在位元組的,讀取空洞將返回以0填充的緩衝區.
#include
//c標準庫
#include
#include
#include
#include
#include
#include
#define buf_size 1024
intmain
(int argc,
char
*ar**)
else
//經過測試 上下兩行沒有區別
// int open_flags = o_creat|o_trunc|o_wronly;
int open_flags = o_creat|o_trunc|o_rdwr;
//檔案訪問許可權, --rw--rw--rw
mode_t file_perms = s_irusr|s_iwusr|s_irgrp|s_iwgrp|s_iroth|s_iwoth;
int outputfd =
open
(ar**[2]
,open_flags,file_perms)
;while
((read_size =
read
(inputfd,buf,buf_size)
)>0)
if(read_size ==-1
)//關閉被複製的檔案
close
(inputfd)
;close
(outputfd);}
}
linux程式設計之檔案I O
linux下c語言對於檔案的操作,我們會經常用到fopen fclose fwrite fread fgets 等一系列庫函式,基本和是和windows下學習c語言一樣的,其實這些庫函式就是在linuxx下對系統呼叫函式的封裝,因此這裡只介紹系統函式下的檔案操作函式。一 open 開啟檔案 incl...
linux系統程式設計之檔案IO(一)
在linux中,一切皆檔案,想對檔案內容進行操作,除了有操作許可權外,更重要的一點是要開啟檔案。以下只有乾貨 1 系統呼叫 include include include int open const char name,int flags int open const char name,int ...
Linux網路程式設計之IO模型
同步是指乙個任務的完成需要依賴另外乙個任務時,只有等待被依賴的任務完成後,依賴的任務才能算完成。非同步是指不需要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工作,依賴的任務也立即執行,只要自己完成了整個任務就算完成了,非同步一般使用狀態 通知和 阻塞是指呼叫結果返回之前,當前執行緒會被掛起,...