我遇到一个问题,当我在Bash脚本文件中运行程序时,select()不会给出超时。这是我的实施:
#include <sys/select.h>
bool checkKeyPressed()
{
struct timeval tv;
tv.tv_sec = 1;
tv.tv_usec = 0;
fd_set descriptor;
const int input = 0;
FD_ZERO(&descriptor);
FD_SET(input, &descriptor);
return select(1, &descriptor, NULL, NULL, &tv) > 0;
}
//直接运行程序后判断结果(纠正有超时)
select(1, [0], NULL, NULL, {1, 0}) = 0 (Timeout)
// strace结果在bash脚本文件中运行应用程序(无超时)
select(1, [0], NULL, NULL, {1, 0}) = 1 (in [0], left {0, 999996})
read(0, "", 1) = 0
如何更改功能以使其在Bash脚本下运行?
答案 0 :(得分:0)
如果您仔细查看跟踪中的read
调用,您会注意到它返回零意味着文件结束。
当文件描述符处于EOF(或远程套接字关闭等)时,描述符可读,read
返回零。
如果你在交互式shell中按 CTRL + d ,你会得到相同的结果。
答案 1 :(得分:0)
如果您只需要1秒的超时时间,请不要将任何文件描述符传递给select()
。在这种情况下,select()
可用作便携式sleep()
函数。