C检测用户在stdin

时间:2017-11-19 21:30:37

标签: c idle-timer

是否可以检测用户是否只是在stdin中输入任何内容?

man select说:

  

select()和pselect()允许程序监视多个文件          描述符,等待一个或多个文件描述符变为          "准备"对于某类I / O操作(例如,输入可能)。

我猜"准备好"表示EOF或NL。但是单个角色怎么样?你能用C编程一个定时器回调,它在用户空闲几秒后启动吗?如果是,怎么样?

1 个答案:

答案 0 :(得分:2)

是的,这是可能的,但您必须将终端设置为字符模式。默认情况下,程序通常以模式启动,在此模式下,程序在输入整行之前不会收到输入通知。

您应该使用类似 ncurses 的库将终端设置为字符模式,例如

initscr();
cbreak();

现在,如果您select()标准输入,系统会通知您输入的每个字符,您可以使用getch()检索这些字符。

有关详细信息,NCURSES Programming HowTo可能会有所帮助。

根据OP的要求编辑:

如果您只需要支持linux,则可以在终端配置中设置适当的选项。

首先,读入当前参数:

struct termios config;
tcgetattr(0, &config);

然后,关闭规范(线路模式):

config.c_lflag &= ~ICANON;

并指定单个字符足以从read:

返回
config.c_cc[VMIN] = 1;

最后,在stdin终端上设置这些参数:

tcsetattr(0, TCSANOW, &config);

现在,read()应该返回单个字符读取。