select()不会在Bash脚本中给出超时

时间:2013-02-12 09:01:03

标签: c++

我遇到一个问题,当我在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脚本下运行?

2 个答案:

答案 0 :(得分:0)

如果您仔细查看跟踪中的read调用,您会注意到它返回零意味着文件结束。

当文件描述符处于EOF(或远程套接字关闭等)时,描述符可读,read返回零。

如果你在交互式shell中按 CTRL + d ,你会得到相同的结果。

答案 1 :(得分:0)

如果您只需要1秒的超时时间,请不要将任何文件描述符传递给select()。在这种情况下,select()可用作便携式sleep()函数。