是否可以检测用户是否只是在stdin中键入任何内容?man select
说:
select()和pselect()允许程序监视多个文件
描述符,等待一个或多个文件描述符变为
为某类I/O操作(例如,可能的输入)做好“准备”。
我想“准备”是指EOF或NL。但是单个字符呢?你能用C语言编写一个计时器回调程序吗?它在用户空闲几秒钟后启动?如果是,怎么做?
最佳答案
是的,这是可能的,但你必须把你的终端进入字符模式。默认情况下,程序通常以行模式启动,在输入整行之前,程序不会收到输入通知。
您应该使用类似于ncurses的库将终端设置为字符模式,例如
initscr();
cbreak();
现在,如果您
select()
您的标准输入,您将收到每个输入字符的通知,您可以使用getch()
检索这些字符。有关更多详细信息,NCURSES Programming HowTo可能会有所帮助。
根据操作请求编辑:
如果您只需要支持linux,那么您可以在终端配置中设置适当的选项。
首先,读取当前参数:
struct termios config;
tcgetattr(0, &config);
然后,关闭canonical(线路模式):
config.c_lflag &= ~ICANON;
并指定单个字符足以从读取返回:
config.c_cc[VMIN] = 1;
最后,在stdin终端上设置以下参数:
tcsetattr(0, TCSANOW, &config);
现在,在读取单个字符时应该返回
read()
。