C 在 stdin 中检测用户输入的字符

C detect user typing characters in stdin

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

man select 说:

select() and pselect() allow a program to monitor multiple file descriptors, waiting until one or more of the file descriptors become "ready" for some class of I/O operation (e.g., input possible).

我猜 "ready" 表示 EOF 或 NL。但是单个字符呢?你能用 C 编写一个计时器回调,它会在用户空闲几秒钟后启动吗?如果是,如何?

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

你应该使用像 ncurses 这样的库来让你的终端进入字符模式,例如 with

initscr();
cbreak();

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

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

根据 OP 的要求编辑:

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

首先,读入当前参数:

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

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

config.c_lflag &= ~ICANON;

并指定单个字符足以 return from read:

config.c_cc[VMIN] = 1;

最后,在您的标准输入终端上设置这些参数:

tcsetattr(0, TCSANOW, &config);

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