1. 程式人生 > >檔案描述符——select()函式以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

檔案描述符——select()函式以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

舉個例子,比如recv(), 在沒有資料到來呼叫它的時候,你的執行緒將被阻塞,如果資料一直不來,你的執行緒就要阻塞很久.這樣顯然不好。所以採用select來檢視套節字是否可讀(也就是是否有資料讀了) 。
步驟如下——
socket s;
.....
fd_set set;
while(1)
{
FD_ZERO(&set);//將你的套節字集合清空
FD_SET(s, &set);//加入你感興趣的套節字到集合,這裡是一個讀資料的套節字s
select(0,&set,NULL,NULL,NULL);//檢查套節字是否可讀,
//很多情況下就是是否有資料(注意,只是說很多情況)
//這裡select是否出錯沒有寫
if(FD_ISSET(s, &set) //檢查s是否在這個集合裡面,
{ //select將更新這個集合,把其中不可讀的套節字去掉
//只保留符合條件的套節字在這個集合裡面
recv(s,...);
}
//do something here
}