C++select()没有等待超时时间
C++ select() not waiting for timeout period
我试图使用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;
}
per-man:select()可以更新timeout参数以指示剩余时间。pselect()不会更改此参数。
这意味着,如果它在2秒钟后超时,它可以将tv_sec设置为0。
如果timeval的两个字段都为0,它将立即返回。
尝试在while()中的每个循环中设置超时,以确保它不会被覆盖。
我根据您的代码进行了一些更改,在select
之后,tv
将被更改。
#include <stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <iostream>
using namespace std;
const int STDIN = 0;
int main(int argc, int *argv[])
{
struct timeval tv,tv1;
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;
memcpy(&tv1, &tv, sizeof(tv));
if(select(STDIN+1, &readfds, NULL, NULL, &tv1) == -1) perror("select");
if (FD_ISSET(STDIN, &readfds)){
getline(cin, buffer);
cout << "You entered: " << buffer << endl;
}else
cout << "Timed out.n" << endl;
}
return 0;
}
如果你读过linux内核中select.c的源代码,你会发现在select()调用中,最后一个参数超时在使用后会被设置为零。
因此,您应该在每次调用select()之前,在循环中设置tv的值。
如果内存可用,则对select()
的调用可以更改tv
的值以指示剩余时间。您应该在每次调用select()
之前重新初始化tv
。
您必须放置
FD_ZERO(&readfds);
FD_SET(STDIN, &readfds);
进入你的循环。赋值:readfds = master;
并不总是有效(实际上,我很确定它不会在每个平台上都有效——这取决于fd_et
的定义)。在循环中设置CCD_ 9也是一个好主意。
相关文章:
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 如何让LLDB在成功时退出,在失败时等待
- C++减少modbus_connect超时
- 没有超时的C++条件变量
- 等待整个 omp 块完成,然后再调用第二个函数
- 如何在C++(VS2010)中设置超时读取USB端口?
- 提升 ASIO - io_service 不要等待连接到线程
- QSslSocket 在等待数据时超时(但 QTcpSocket 不会)
- setSockopt在C 中不起作用(超时设置为1s,等待更长的时间)
- Boost.Thread超时等待
- 等待超时 WaitForSingleObject
- 等待单个对象不超时
- select(NULL、NULL、NULL 和超时)是否只是等待给定的时间?
- C++select()没有等待超时时间
- Modbus通信减少等待超时时间
- 等待线程超时:冻结
- 多线程:阻塞等待超时
- Boost ASIO套接字读取N字节不多不少,等待它们到来或超时异常
- Qt:等待具有超时管理的信号
- 立即从另一个线程中止zeromq-recv()或poll(),而无需等待超时