【问题标题】:FD_ISSET returns 0 after FD_SETFD_ISSET 在 FD_SET 之后返回 0
【发布时间】:2013-05-21 12:56:58
【问题描述】:

我有以下代码:

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 服务器但运行的代码中没有任何 FD_CLR 时,代码会跳转到 while。 我是集合和文件描述符的新手,我还没有发现发生了什么。你有什么想法吗?

谢谢!

【问题讨论】:

  • 什么是ptv?你如何初始化它?
  • 此外,select 可以返回负值,您必须检查它们并检查 errno

标签: linux sockets network-programming set file-descriptor


【解决方案1】:

select(2) 的第二、第三和第四个参数是 in-out 参数,这意味着调用会修改它们以让您知道返回时发生了什么事件。这就是为什么您需要在每次调用 select(2) 之前重新设置文件描述符集的原因。

还可以研究其他解复用工具,例如 poll(2)epoll(7)

【讨论】:

    猜你喜欢
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 2017-01-04
    • 2012-09-15
    • 2016-04-14
    相关资源
    最近更新 更多