Linux下程式設計之I O操作 一

2021-10-23 08:41:18 字數 3817 閱讀 1558

最近剛剛回國, 因為疫情的緣故在上海隔離. 閒來無事,想要複習複習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模型

同步是指乙個任務的完成需要依賴另外乙個任務時,只有等待被依賴的任務完成後,依賴的任務才能算完成。非同步是指不需要等待被依賴的任務完成,只是通知被依賴的任務要完成什麼工作,依賴的任務也立即執行,只要自己完成了整個任務就算完成了,非同步一般使用狀態 通知和 阻塞是指呼叫結果返回之前,當前執行緒會被掛起,...