天天看點

Linux IO模型漫談(4)- 非阻塞IO1 fcntl函數2 非阻塞IO傳回的錯誤3用戶端代碼

首先先說一下,阻塞io會在哪些地方阻塞住呢?輸入操作read, 輸出操作write,接受請求操作accept,發送請求操作connect,這四個地方阻塞程序。

非阻塞io的模型圖示在前面的章節有講過,它和阻塞io的最大差別就是:如果連接配接或者操作不能立即建立,那麼連接配接的建立照樣能發起,隻是會傳回一個錯誤資訊。

同樣,先說明幾個用到的函數和操作:

其全名為”file control“。顧名思義,fcntl可以執行各種操作符控制操作。

第一個參數fd是檔案描述符

第二個參數cmd是操作指令,比如設定套接字阻塞非阻塞的指令為f_setfl, 設定套接字屬主的指令為f_setown

第三個參數以後,是操作指令的參數。比如設定非阻塞io型的f_setfl的參數為o_nonblock

是以設定非阻塞io的典型設定代碼為:

flags = flags | o_nonblock;

fcntl(fd, f_setfl, flags);

對于不能滿足的非阻塞io操作,system v會傳回eagain錯誤,而源自berkeley的實作傳回ewouldblock。大多數目前系統把這兩個錯誤碼定義為相同的值。

對不能滿足的非阻塞io連接配接,系統會傳回einprogress

按照非阻塞的定義,我們隻需要将cli做下面修改:

運作方式:

1 server不啟動

2 client啟動,則會在connect這個地方進入無限循環。

好吧,是不是覺得有問題?

1 這種模型,用戶端使用輪詢不斷調用io操作,那麼,cpu就會一直用于輪詢,造成cpu的浪費。

2 這種模型,代碼量比阻塞的模型大很多

是以這個模型實際上是很少使用的。

繼續閱讀