對於select理解總結

2021-07-14 23:59:22 字數 1336 閱讀 5421

select用途:在一段時間內,監聽使用者感興趣的檔案描述符上的可讀可寫和異常等時間。

對於select函式的介面:

int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,struct timeval* timeout);

nfds表示監聽的檔案描述符總數,他是監聽的最大值加1,目的是為了節省時間

後面三個引數是可讀可寫和異常,最後乙個引數是等待時間,如果給timeout變數的成員都傳遞0那麼就立即返回,null就無限等待,若是乙個struct timeval結構體,那麼時間間就自己進行設定,具體的後續操作可以通過返回值來判定。

fd_set是乙個結構體,最多監聽1024個,這是select的預設最大。

關於select的返回值,如果超時切沒有任何描述符就緒,那麼返回0,如果失敗則返回-1,如果成功那麼就返回就緒檔案描述符的總數,如果在等待期間接收到了訊號那就返回-1。

select對於接收帶外資料也普通資料  都可使得select返回,但是select處於不同的就緒狀態,前者可讀,後者異常。

關於select監聽其他的程序給自己傳送資訊的**如下:

#include

#include

#include

#include

#include

#include

#include

int main()

if(fd_isset(c,&rdset))

;int ret =  recv(c,buff,127,0);

if(ret <= 0)//如果客戶端關閉,返回0直接退出

printf("%s",buff);}}

close(c);

close(sockfd);

return 0;

}相應的客戶端**:

#include

#include

#include

#include

#include

#include

#include

#include

int main(int argc,char *argv)

;fgets(buff,128,stdin);//fgets會用到空格回車

if(strncmp(buff,"end",3)==0)

send(sockfd,buff,strlen(buff),0);//把收到的訊息再傳送出去

memset(buff,0,128);

}close(sockfd);//關閉

return 0;

}個人總結,如果有不對的歡迎指正

Select歸納總結

include include int select int maxfdpl,fd set readset,fd set write,fd set exceptset,const struct timeval timeout 返回值 該函式的返回值表示跨所有描述符集的已就緒的總位數。如果在任何描述符...

select函式總結

阻塞方式block,就是程序或是執行緒執行到這些函式時必須等待某個事件的發生,如果事件沒有發生,程序或執行緒就被阻塞,函式不能立即返回。使用select就可以完成非阻塞non block,就是程序或執行緒執行此函式時不必非要等待事件的發生,一旦執行肯定返回,以返回值的不同來反映函式的執 況,如果事件...

epoll 相對於select的優勢

分類 linuxknowhow 819 0 舉報 收藏這個問題至今才去查,是因為我需要用的地方真的不是很多,學習了那麼多年,不知道自己究竟學了什麼,覺得自己的優勢就是針對特定知識點都熟悉點,一整套的軟體架構沒有搞過。再總結一點select的不足點 select 最不能忍受的是乙個程序所開啟的fd是有...