【问题标题】:select() doesn't use what is set for timevalselect() 不使用为 timeval 设置的内容
【发布时间】:2014-04-23 14:52:44
【问题描述】:

我在下面有一个 sn-p - 我已经通过多种方式调整了我的 tv_usec,但我一直坐在 select() 循环中几乎正好 10 秒,无论 tv_usec 设置在什么位置。

    char buffer[512];
    fd_set readfds;
    struct timeval tv;
    tv.tv_usec = 50;    

    int rv = 1;

    // clear the set ahead of time
    FD_ZERO(&readfds);

    // add our descriptors to the set
    FD_SET(mySocket, &readfds);

    // the n param for select()
    int n = mySocket + 1;

    while(rv != 0)
    {
        rv = select(n, &readfds, NULL, NULL, &tv);

        if (rv == -1)
            perror("select"); // error occurred in select()

        bzero(buffer,512);
        int n = recvfrom(mySocket,buffer,512,0,(struct sockaddr *)&server, &sockLen);

        // do stuff...
    }

【问题讨论】:

  • tv_sec 未初始化,将其初始化为 tv.tv_sec = 0

标签: c++ sockets timeval


【解决方案1】:

tv.tv_sec 需要初始化为 something。设置tv.tv_sec = 0 解决了这个问题。

【讨论】:

  • 不是默认为10,而是未初始化的内存可能有任意的先前内容——读取它实际上是未定义的行为。
  • 它实际上并没有默认任何东西。如果您不设置该值,它将包含当时恰好在该内存位置中的任何值,即未定义的值。
  • 啊,很有趣。我想知道为什么它总是在 10 秒时正确。
  • @MrDuk:嗯,你的timeval 结构在堆栈上,堆栈内容可以通过先前的堆栈使用设置为特定值,例如为早期函数调用准备的值。如果没有看到程序,很难理解为什么它会是确定性的。但是,如果你在readfdsts 之间添加一个变量,在某处添加一个函数调用,或者使用不同的优化标志进行编译,你可以很容易地看到一个完全不同且可能变化的值。
  • 请记住,timeval 是来自 C 库头文件的结构,而 C 结构永远不会有自动构造函数(充其量只有像 pthread_mutex_init 这样的函数,您必须手动调用“构造”它们,否则你可以在定义后立即为它们分配一个初始值,这样更容易检查它是否一致完成)。
猜你喜欢
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-08
  • 1970-01-01
相关资源
最近更新 更多