Linux Unix中系統級IO

2022-03-12 00:46:26 字數 1754 閱讀 7862

linux/unix i/o:將裝置對映為檔案的方式,允許unix

核心引出乙個簡單、低階的應用介面。

linux/unix io的系統呼叫函式很簡單,它只有5個函式:open(開啟)、close(關閉)、read(讀)、write(寫)、lseek(定位)。但是系統io呼叫開銷比較大,一般不會直接呼叫,而是通過呼叫rio包進行健壯地讀和寫,或者呼叫c語言的標準i/o進行讀寫。儘管如此,rio包和標準io也都是封裝了unix i/o的,所以學習系統io的呼叫才能更好地理解高階io的原理。

1、開啟檔案 返回乙個小的非負整數,即描述符。用描述符來標識檔案。每個程序都有三個開啟的檔案:標準輸入(0

)、標準輸出(

1)、標準錯誤(2)

#include #include 

#include

int open(char *filename, int

flags, mode_t mode);

//返回:若成功則為新檔案描述符,若出錯為-1

flags:程序打算如何訪問檔案

o_rdonly:唯讀    o_wronly:只寫    o_rdwr:可讀可寫

o_creat:如檔案不存在,則建立

o_trunc:如果檔案已存在,則截斷

mode:指定新檔案的訪問許可權位

每個程序都有乙個umask,通過呼叫umask函式設定。所以檔案的許可權為被設定成mode & ~umask

2、改變當前檔案位置  從檔案開頭起始的位元組偏移量。系統核心保持乙個檔案位置k

,對於每個開啟的檔案,起始值為

0。應用程式執行

seek

,設定當前位置

k,通過呼叫lseek

函式,顯示地修改當前檔案位置。

3、讀寫檔案。讀操作:從檔案拷貝n

個位元組到儲存器,從當前檔案位置

k開始,將

k增加到

k+n,對於乙個大小為

m位元組的檔案,當

k>=m

時,讀操作觸發乙個

eof的條件。寫操作:從儲存器拷貝

n個位元組到檔案,

k更新為

k+n

#include ssize_t read(

int fd, void *buf, size_t n);

//返回:若成功則為讀的位元組數,若eof則為0,若出錯為-1.

ssize_t write(

int fd, const

void *buf, size_t n);

//返回:若成功則為寫的位元組數,若出錯則為-1.

read函式:從描述符為

fd的當前檔案位置拷貝至多

n個位元組到儲存器位置

buf。返回

-1表示乙個錯誤,返回0表示

eof,否則返回實際讀取的位元組數。

write函式:從儲存器位置

buf拷貝至多

n個位元組到描述符

fd的當前檔案位置。

ps:ssize_t與

size_t

區別:size_t

:unsigned int

,ssized_t

:int

。4、關閉檔案:核心釋放檔案開啟時建立的資料結構,並恢復描述符到描述符池中,程序通過呼叫close

函式關閉乙個開啟的檔案。關閉乙個已關閉的描述符會出錯。

#include int close(int

fd);

//返回:若成功則為0,若出錯則為-1.

系統級I O中的共享檔案

接下來展示一些示例 首先一些有用的標頭檔案放出來 include include include include include include include include include include include include include include include inclu...

Linux Unix 系統簡介

unix系統介紹 最早版於1970年問世於貝爾實驗室,作者是丹尼斯.里奇和肯.湯普遜。是最早的多使用者 多工 支援多種cpu架構,高安全性 高穩定性 高可靠性。既能構架大型關鍵性業務系統的商用伺服器,也能支援嵌入式裝置。minix基於微核心載入的類unix系統,名為minix 即小型的unix 並開...

透徹 Linux Unix 五種 IO 模型

用一幅圖表示所支援的i o模型 縱向維度是 阻塞 blocking 非阻塞 non blocking 橫向維度是 同步 非同步 總結起來是四種模型 同步阻塞 同步非阻塞 非同步阻塞 非同步非阻塞 unix網路程式設計 中劃分出了 第五種 模型 訊號驅動式io 其實屬於非同步阻塞型別,這種模型的通知方...