【发布时间】:2016-06-25 14:06:52
【问题描述】:
我正在尝试使用 beej 中的 select() 来理解程序。
当我按下一个键时,程序会打印“按下了一个键”。但是,程序退出后,终端上会回显相同的键,并且出现错误“找不到命令”。为什么按下的键会回显到终端上?
源代码:
/*
* select.c demo
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#define STDIN 0
int main(int argc, char *argv[]){
struct timeval tv;
fd_set readfds;
tv = (struct timeval){0};
tv.tv_sec = 2;
tv.tv_usec = 5000000;
FD_ZERO(&readfds);
FD_SET(STDIN, &readfds);
select(STDIN + 1, &readfds, NULL, NULL, &tv);
if ( FD_ISSET(STDIN, &readfds)){
printf("A key was pressed\n");
}
else{
printf("Timed Out!\n");
}
return 0;
}
输出:
shilpa@shilpa-VirtualBox:Socket_Programming$
shilpa@shilpa-VirtualBox:Socket_Programming$ ./select
f
A key was pressed
shilpa@shilpa-VirtualBox:Socket_Programming$ f
f: command not found
【问题讨论】:
-
请将代码和输出粘贴到此处,作为文本。
-
好吧,你不是
read()ing "key",只是检测输入的可用性。 “key”保留在输入缓冲区中。 -
@FrédéricHamidi :我明白了......但是为什么它会打印在终端(stdout)上?
-
正如@PSkocik 所说,shell 会看到未读的输入,它的工作是在其命令行上输出它(在 *NIX 上,您可以在命令运行时输入一些内容,并且预期某些内容会在命令完成运行后包含在 shell 的命令行中)。
-
非常感谢@FrédéricHamidi