0

我有一个问题,当我在 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;
}

// 直接运行程序后的strace结果(修正有超时)

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 脚本下运行?

4

2 回答 2

0

如果您只需要 1 秒超时,请不要将任何文件描述符传递给select(). 在这种情况下select(),作为一个便携式sleep()功能。

于 2013-02-12T13:36:27.543 回答
0

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

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

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

于 2013-02-12T09:19:50.743 回答