c - 选择仅有效一次

标签 c linux systems-programming

   /* Wait up to 1 min */
   tv.tv_sec = 60;
   tv.tv_usec = 0;

   FD_ZERO(&readfd);
   FD_ZERO(&writefd);
   for(i=0;i<3;i++)
   {
     FD_SET(my_rdfd[i], &readfd);
     FD_SET(my_wrfd[i], &writefd);
   }

   for(int i=0;i<10;i++)
   {
     retval = select((NRFDS)+1, &readfd, &writefd, (fd_set*)0, &tv);//NRFDS is a macro

     if (retval == -1)
       printf("select() error");
     else if (retval)
     {
       printf("data found\n");
       //do something with the data recieved
     }
     else
       printf("Timeout.\n");
   }

问题是,for 循环中的 select() 第一次按预期工作,很好,对于后续循环,它不起作用。我究竟做错了什么?

感谢您的帮助。

最佳答案

尝试将其放入 for 循环中:

for(i=0;i<10;i++)
{
  tv.tv_sec = 60;
   tv.tv_usec = 0;

   FD_ZERO(&readfd);
   FD_ZERO(&writefd);
   for(j=0;j<3;j++)
   {
     FD_SET(my_rdfd[j], &readfd);
     FD_SET(my_wrfd[j], &writefd);//Note that you should use a different inside forloop
   }

   //select statement here

}

select() 返回时,它会更改集合以显示哪些文件描述符已准备好读/写/异常。所有其他标志都将被清除。

重新启用在开始另一个选择之前清除的文件描述符非常重要,否则,您将不再等待这些文件描述符。

关于c - 选择仅有效一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12987858/

相关文章:

C 中的条件运算符

c - 使用指针查找字符串的长度

node.js - 无法执行 Node 命令的二进制文件

linux - 在 Linux 中创建虚拟网络接口(interface)?

linux - Linux 中的 'stale file handle' 是什么意思?

c++ - 在 C/C++ 中直接写入内存地址的最短代码是什么?

c - Valgrind 报告 getaddrinfo 正在泄漏内存?

C++ 静态链接奇怪的行为

c - Windows 上的 libeio

windows - 在运行时更改进程名称