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