select與阻塞和非阻塞

2021-07-10 17:48:56 字數 718 閱讀 2496

這2天一直和同事在討論socket的非阻塞用在什麼場合,並且認為在select時,使用的socket要設定成阻塞的,今天在網上搜了一下,才發現,原來,我們搞錯了,乙個套接字阻塞或者不阻塞,select就在那裡,它可以針對這2種套接字使用,對任何一種套接字的輪詢檢測,超時時間都是有效的,區別就在於:

當select完畢,認為該套接字可讀時,

1 .阻塞的套接字,會讓read阻塞,直到讀到所需要的所有位元組;

2 .非阻塞的套接字,會讓read讀完fd中的資料後就返回,但如果原本你要求讀10個資料,這時唯讀了8個資料,如果你不再次使用select來判斷它是否可讀,而是直接read,很可能返回eagain或=ewouldblock(bsd風格) ,

此錯誤由在非阻塞套接字上不能立即完成的操作返回,例如,當套接字上沒有排隊資料可讀時呼叫了recv()函式。此錯誤不是嚴重錯誤,相應操作應該稍後重試。對於在非阻塞   sock_stream套接字上呼叫connect()函式來說,報告ewouldblock是正常的,因為建立乙個連線必須花費一些時間。

ewouldblock的意思是如果你不把socket設成非阻塞(即阻塞)模式時,這個讀操作將阻塞,也就是說資料還未準備好(但系統知道資料來了,所以select告訴你那個socket可讀)。使用非阻塞模式做i/o操作的細心的人會檢查errno是不是eagain、ewouldblock、eintr,如果是就應該重讀,一般是用迴圈。如果你不是一定要用非阻塞就不要設成這樣,這就是為什麼系統的預設模式是阻塞。

select與阻塞和非阻塞

這2天一直和同事在討論socket的非阻塞用在什麼場合,並且認為在select時,使用的socket要設定成阻塞的,今天在網上搜了一下,才發現,原來,我們搞錯了,乙個套接字阻塞或者不阻塞,select就在那裡,它可以針對這2種套接字使用,對任何一種套接字的輪詢檢測,超時時間都是有效的,區別就在於 當...

select與阻塞和非阻塞

這2天一直和同事在討論socket的非阻塞用在什麼場合,並且認為在select時,使用的socket要設定成阻塞的,今天在網上搜了一下,才發現,原來,我們搞錯了,乙個套接字阻塞或者不阻塞,select就在那裡,它可以針對這2種套接字使用,對任何一種套接字的輪詢檢測,超時時間都是有效的,區別就在於 當...

阻塞 非阻塞的概念和select函式的阻塞功能

1 阻塞block 所謂阻塞方式block,顧名思義,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果事件沒有發生,程序或執行緒就被阻塞,函式不能立即返回。例如socket程式設計中connect accept recv recvfrom這樣的阻塞程式。再如絕大多數的函式呼叫 語句執行...