首先,我們來看一下,有哪五種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呢?拿一次磁碟檔案讀取為例,我們要讀取的檔案是...