2013-05-21 38 views
0

後我有以下代碼:FD_ISSET返回0 FD_SET

FD_SET(mc_sock, &readfds); 

foo = FD_ISSET(mc_sock, &readfds); // returns 1 

// Wait until some socket on the set is ready to be read 
while(select (FD_SETSIZE,&readfds,NULL,NULL,ptv)) { 

foo = FD_ISSET(mc_sock, &readfds); // returns 0 

我添加mc_sock到readfds和FD_ISSET如預期返回1。然而,稍後當while循環FD_ISSET返回0而不調用FD_CLR時。 當我運行MobileC服務器時代碼跳轉到while,但代碼運行時沒有任何FD_CLR。 我在集合和文件描述符中是一個新手,我還沒有發現發生了什麼。你有好主意嗎?

謝謝!的select(2)

+0

什麼是'ptv'?你如何初始化它? –

+0

此外,'select'可以返回負值,您必須**檢查它們並檢查'errno'。 –

回答

2

第二,第三和第四參數是進出參數,這意味着調用修改他們讓你知道在返回時發生了什麼事件。這就是爲什麼在每次調用select(2)之前需要重新設置文件描述符集的原因。

也看看其他的多路複用設施,如poll(2)epoll(7)