|
關(guān)于select函數(shù):
其函數(shù)原型為: int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 此函數(shù)的功能是由內(nèi)核檢測在timeout時間內(nèi),是否有readfds,writefds,exceptfds三個句柄集(file descriptors)里的某個句柄(file descriptor)的狀態(tài)符合尋求,即readfds句柄集里有句柄可讀或writefds句柄集里有可寫或exceptfds句柄集里有例外發(fā)生,任何一個有變化函數(shù)就立即返回,返回值為timeout發(fā)生狀態(tài)變化的句柄個數(shù)。 n是所有readfds,writefds,exceptfds三個句柄集(file descriptors)里編號最大值加1。比如:要檢測兩個socket句柄fd1和fd2在timeout時間內(nèi)是否分別可讀和可寫就可以這樣: 先把兩個句柄集(file descriptors)清零: FD_ZERO (&readfds); FD_ZERO (&writefds); 然后把fd1加入讀檢測集: FD_SET (fd1, &readfds); 然后把fd2加入寫檢測集: FD_SET (fd2, &writefds); 再給timeout設(shè)置值,timeout是這樣的一個結(jié)構(gòu): struct timeval { long tv_sec; /* seconds */ long tv_usec; /* microseconds */ }; 你可以這樣賦值: timeout.tv_sec=1; timeout.tv_uec=0; 表示檢測在1秒鐘內(nèi)是否有句柄狀態(tài)發(fā)生變化。 如果有句柄發(fā)生變化,就可以用FD_ISSET檢測各個句柄,比如: FD_ISSET (fd1, &readfds);//檢測是否fd1變成可讀的了 FD_ISSET (fd2, &writefds);//檢測是否fd2變成可寫的了 示意程序代碼如下:
|
|
|