检查是否按下了某个键,如果是,则执行操作
考虑一下'select()',如果这个(据说是 Posix)函数在你的操作系统上可用。
'select()' 使用 3 组位,您可以使用提供的函数创建这些位(参见 man select、FD_SET 等)。您可能只需要创建输入位(现在)
来自手册页:
'select()' "允许程序监视多个文件描述符,等待一个或多个文件描述符为某种类型的 I/O 操作“准备好”(例如,可能的输入)。文件描述符是如果可以执行相应的 I/O 操作(例如,没有阻塞的 read(2)...),则认为已准备就绪"
当 select 被调用时:
a) 该函数查看集合中标识的每个 fd,如果该 fd 状态表明您可以做某事(可能是读,也可能是写),select 将返回并让您去做...'all you got要做的'是扫描位,找到设置位,并对与该位关联的 fd 采取行动。
第一组(传递给 select)包含活动输入 fd(通常是设备)。您可能只需要这组中的 1 位。并且只有 1 个 fd(即来自键盘的输入)、1 位,这一切都非常简单。通过 select 的返回,您可以“做事”(也许,在您获取 char 之后)。
b) 该函数还有一个超时,您可以通过它确定等待 fd 状态更改的时间。如果 fd 状态没有改变,超时将导致 'select()' 返回 0。(即没有键盘输入)您的代码此时也可以做一些事情,也许是输出。
fyi - fd 通常是 0,1,2...记住 C 使用 0 作为 STDIN、1 和 STDOUT。
简单的测试设置:我打开一个终端(与我的控制台分开),然后在该终端中键入 tty 命令以查找其 ID。响应通常类似于“/dev/pts/0”,或 3,或 17...
然后我通过使用 open 得到一个 fd 在 'select()' 中使用:
// flag options are: O_RDONLY, O_WRONLY, or O_RDWR
int inFD = open( "/dev/pts/5", O_RDONLY );
计算这个值很有用。
这是一个需要考虑的 sn-p(来自 man select):
fd_set rfds;
struct timeval tv;
int retval;
/* Watch stdin (fd 0) to see when it has input. */
FD_ZERO(&rfds);
FD_SET(0, &rfds);
/* Wait up to five seconds. */
tv.tv_sec = 5;
tv.tv_usec = 0;
retval = select(1, &rfds, NULL, NULL, &tv);
/* Don't rely on the value of tv now! */
if (retval == -1)
perror("select()");
else if (retval)
printf("Data is available now.\n"); // i.e. doStuff()
/* FD_ISSET(0, &rfds) will be true. */
else
printf("No data within five seconds.\n"); // i.e. key not pressed