C++ select()不等待超时时间

pan*_*ter 4 c++ select synchronization network-programming

我正在尝试使用select函数接受输入,但如果用户没有输入任何内容,则每2秒执行一次其他操作.下面的代码在第一次到达select()时等待两秒钟,但是一旦它打印出第一个"超时"消息,它就会快速打印出"超时"而不等待2秒,基本上进入无限循环.谁知道问题是什么?谢谢你的帮助.

#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
using namespace std;

const int STDIN = 0;
int main(int argc, int *argv[])
{
struct timeval tv;
fd_set readfds, master;
tv.tv_sec = 2;
tv.tv_usec = 0;
FD_ZERO(&readfds);
FD_ZERO(&master);
FD_SET(STDIN, &readfds);
FD_SET(STDIN, &master);
string buffer = "";
while(buffer != "quit"){
    readfds = master;
    if(select(STDIN+1, &readfds, NULL, NULL, &tv) == -1) perror("select");
    if (FD_ISSET(STDIN, &readfds)){
        getline(cin, buffer);
        cout << "You entered: " << buffer << endl;
    }else
        cout << "Timed out.\n" << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)

小智 14

per man:select()可以更新超时参数以指示剩余时间.pselect()不会改变这个参数.

这意味着如果它在2秒后超时,则可以将tv_sec设置为0.

如果timeval的两个字段都是0,它将立即返回.

尝试在while()内的每个循环中设置超时,以确保它不会被覆盖.