Linux 五種I O模型

2021-09-24 16:06:54 字數 2031 閱讀 4571

首先,我們來看一下,有哪五種i/o模型

小結

非阻塞i/o記錄鎖系統v流機制i/o多路轉接(也叫i/o多路復用)readv和writev函式以及儲存對映i/o(mmap),這些統稱為高階i/o。

首先,我們來看乙個介面

int

fcntl

(int fd,

int cmd,..

./* arg */);

/** 功能:針對描述符提供控制。

* 引數:

* fd:檔案描述符;

* cmd:代表操作的命令

* 返回值:

* fcntl的返回值與命令有關。如果出錯,所有命令都返回-1,如果成功則返回某個其他值。

* 下列四個命令有特定返回值:

* f_dupfd(返回新的檔案描述符);

* f_getfd(返回相應標誌);

* f_getfl(返回相應標誌);

* f_getown(返回乙個正的程序id或負的程序組id)。

*/

該函式傳入的cmd不同,後面追加的引數也不同,函式返回值也不同

fcntl函式有5種功能

複製乙個現有的描述符(cmd=f_dupfd)

獲得/設定檔案描述符標記(cmd=f_getfd或f_setfd)

獲得/設定檔案狀態標記(cmd=f_getfl或f_setfl)

獲得/設定非同步i/o所有權(cmd=f_getown或f_setown)

獲得/設定記錄鎖(cmd=f_getlk,f_setlk或f_setlkw)

這裡只使用第3種功能獲取/設定檔案狀態標記就可以將乙個檔案描述符設定為非阻塞

實現乙個函式將檔案描述符設定為非阻塞

void

setnonblock

(int fd)

// 將檔案描述符屬性設定回去,加上乙個o_nonblock

fcntl

(fd, f_setfl, flag | o_nonblock)

;}

下面,我們使用這個函式來玩一下,輪詢方式讀取標準輸入

#include

#include

#include

#include

#define buf_size 1024

void

setnonblock

(int fd)

// 將檔案描述符屬性設定回去,加上o_nonblock

fcntl

(fd, f_setfl, flag | o_nonblock);}

intmain()

; ssize_t read_size =

read(0

, read_buf,

sizeof

(read_buf)-1

);if(read_size <0)

// 列印讀取到的內容

std::cout << read_buf << std::endl;

}return0;

}

編譯執行,效果如下

Linux五種IO模型

五種io模型的理解 阻塞io 收銀台等待 在核心將資料準備好之前,系統調 會 直等待.所有的套接字,預設都是阻塞 式.阻塞io 座位等待 往往需要程式設計師迴圈的方式反覆嘗試讀寫檔案描述符,這個過程稱為輪詢.訊號驅動io 等服務員叫 核心將資料準備好的時候,使 sigio訊號通知應用程式進行io操作...

linux 五種高階IO模型

阻塞io模型 在核心將資料準備好,系統呼叫會一直等待,所有的套接字預設都是阻塞io方式 阻塞io是最常見的io模型 非阻塞io模型 非阻塞io往往需要程式設計師迴圈的方式反覆嘗試讀取檔案描述符,這個過程稱為輪詢,這對於cpu來說的話是較大的浪費,一般只有特定的場景下才能使用 訊號驅動io模型 核心將...

Linux的五種IO模型

在linux unix 作業系統中,共有五種io模型,分別是 阻塞io模型 非阻塞io模型 io復用模型 訊號驅動io模型以及非同步io模型。我們常說的io,指的是檔案的輸入和輸出,但是在作業系統層面是如何定義io的呢?到底什麼樣的過程可以叫做是一次io呢?拿一次磁碟檔案讀取為例,我們要讀取的檔案是...