我有以下代码:
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)
的第二、第三和第四个参数是in-out参数,这意味着调用会修改它们,让您知道返回时发生了什么事件。这就是为什么每次调用select(2)
之前都需要重新配置文件描述符集。
也可以查看其他的复用设备,如AA>和AA>。