首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C中回忆选择超时后的选择?

如何在C中回忆选择超时后的选择?
EN

Stack Overflow用户
提问于 2016-04-22 06:27:14
回答 2查看 2K关注 0票数 3

我使用select进行同步I/O,multiplexing.It将检查1 second.After 1秒内的任何数据,如果没有数据,它将显示一个输出(puts("Waited for 1 sec no data");),然后它将再次检查data.But,这只是第一次工作,然后进入无穷无尽的循环。有没有其他的解决办法。

代码语言:javascript
复制
//..............................
//.............................
//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.

            }
      }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-22 06:43:59

来自人选

在Linux上,select()修改超时以反映没有休眠的时间;大多数其他实现没有这样做。(POSIX.1-2001允许两种行为。)当将读取超时的Linux代码移植到其他操作系统时,以及将代码移植到Linux时,如果循环中的多个select()不重新初始化,就会重用struct,这都会造成问题。在select()返回后,将超时考虑为未定义。

因此,与master一样,您必须在每个select调用之前设置tv

在我的密码里,我经常有这样的东西:

代码语言:javascript
复制
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"); 
    }
}
票数 3
EN

Stack Overflow用户

发布于 2019-11-29 02:17:36

除了Mathieu答案之外,在每次调用选择FD_ZERO之前,似乎都必须调用空可读文件句柄集,然后调用FD_SET。

在到达超时后,select()返回始终为0,这让我很费劲(不管有数据要读取这一事实(我从键盘读取输入,我用'cat‘命令检查数据在每个键按下发送)。

代码应该是(对以前的答案的信任):

代码语言:javascript
复制
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"); 
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36786460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档