/* 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/