select()在Bash脚本中不提供超时

select() does not give timeout inside a Bash script

本文关键字:超时 脚本 Bash select      更新时间:2023-10-16

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

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

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

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

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