在前面已經說過了,非同步和同步的概念和區別,它們和select以及阻塞socket不是同乙個層面上的概念。
這裡要說的是select和阻塞socket的關聯,
先提乙個問題:在程式中使用了select機制,就一定不會使程式阻塞在除select函式之外的地方嗎?? 答案是否定的,程序還是會阻塞在某些地方。
下面舉例說明:
乙個tcp套接字在核心中關聯了兩個緩衝區,傳送與接受緩衝區。
select機制的作用是保證,如果和這個套接字相關聯的兩個緩衝區中有讀的資料或者寫的空間,那麼select會返回給程序相應的訊息,
之後方便讀或寫。 但是,看下面這段**:
void fun(int sockfd)
在recv資料後,接著,把收到的資料送到傳送緩衝區中,但這時候,有可能出現傳送緩衝區空間不夠的情況,那麼這時候,如果
該套接字是非阻塞的,程序這個時候就會被掛起。 可以看到,使用了select的程式,一樣會被意外掛程式起。
如果把該套接字設定為非阻塞的:
val fcntl(sockfd,f_getfl,0); fcntl(sockfd,f_setfl,val|o_nonblock);
那麼,在執行send的時候,就不會阻塞,會立即返回乙個ewouldblcok錯誤。
完。。
阻塞式Socket VS 非阻塞式Socket
主要有三種型別的socket,永久阻塞模式 阻塞加超時模式和非阻塞式。socket模式可以通過apr socket opt set 和apr socket timeout set 這兩個api控制。在windows和unix系統上預設的socket是永久阻塞模式 apr so nonblock ti...
select與阻塞和非阻塞
這2天一直和同事在討論socket的非阻塞用在什麼場合,並且認為在select時,使用的socket要設定成阻塞的,今天在網上搜了一下,才發現,原來,我們搞錯了,乙個套接字阻塞或者不阻塞,select就在那裡,它可以針對這2種套接字使用,對任何一種套接字的輪詢檢測,超時時間都是有效的,區別就在於 當...
select與阻塞和非阻塞
這2天一直和同事在討論socket的非阻塞用在什麼場合,並且認為在select時,使用的socket要設定成阻塞的,今天在網上搜了一下,才發現,原來,我們搞錯了,乙個套接字阻塞或者不阻塞,select就在那裡,它可以針對這2種套接字使用,對任何一種套接字的輪詢檢測,超時時間都是有效的,區別就在於 當...