如何在C中超时后调用select?

我使用select进行同步I / O多路复用。它将检查任何数据1秒。如果没有数据puts("Waited for 1 sec no data");它将显示输出(置位puts("Waited for 1 sec no data"); )然后它将再次检查对于data.But这只是在第一次工作然后它进入无限循环。 对此有没有替代解决方案。

 //.............................. //............................. //Creating listener socket and other sort of things struct timeval tv; tv.tv_sec=1; tv.tv_usec=0; while(1) { FD_ZERO(master); FD_SET(listener,master); fdmax = listener; int retval=select(fdmax+1,master, NULL, NULL,&tv); printf("retval is %d\n",retval); if(retval == -1) { perror("Server-select() error"); }else if(retval) { puts("Data available"); //If there is no data do some work and checkagain. }else { puts("Waited for 1 sec no data"); //If there is no data do some work and checkagain. } } 

从男人选择 :

在Linux上,select()修改超时以反映未睡眠的时间; 大多数其他实现不会这样做。 (POSIX.1-2001允许任何一种行为。)当读取超时的Linux代码移植到其他操作系统时,以及当代码移植到Linux时,在循环中为多个select()重用struct timeval时,这会导致问题重新初始化它。 在select()返回后,请考虑超时未定义。

所以像master一样,你必须在每次select呼叫之前设置tv

在我的代码中,我经常有类似的东西:

 FD_ZERO(master); FD_SET(listener,master); fdmax = listener; while (1) { struct timeval tv = {1, 0}; int retval=select(fdmax+1,master, NULL, NULL,&tv); printf("retval is %d\n",retval); if(retval == -1) { perror("Server-select() error"); break; // <-- notice the break here } else if(retval) { puts("Data available"); } else { puts("Waited for 1 sec no data"); } }