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 读取单个字符。
是否可以检测用户是否只是在标准输入中输入任何内容?
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 读取单个字符。