我使用select进行同步I/O,multiplexing.It将检查1 second.After 1秒内的任何数据,如果没有数据,它将显示一个输出(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.
}
}发布于 2016-04-22 06:43:59
来自人选
在Linux上,select()修改超时以反映没有休眠的时间;大多数其他实现没有这样做。(POSIX.1-2001允许两种行为。)当将读取超时的Linux代码移植到其他操作系统时,以及将代码移植到Linux时,如果循环中的多个select()不重新初始化,就会重用struct,这都会造成问题。在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");
}
}发布于 2019-11-29 02:17:36
除了Mathieu答案之外,在每次调用选择FD_ZERO之前,似乎都必须调用空可读文件句柄集,然后调用FD_SET。
在到达超时后,select()返回始终为0,这让我很费劲(不管有数据要读取这一事实(我从键盘读取输入,我用'cat‘命令检查数据在每个键按下发送)。
代码应该是(对以前的答案的信任):
while (1)
{
struct timeval tv = {1, 0};
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");
break; // <-- notice the break here
} else if(retval) {
puts("Data available");
} else {
puts("Waited for 1 sec no data");
}
}https://stackoverflow.com/questions/36786460
复制相似问题