我有一组标准输入,每当用户键入并点击时select()
,我想从标准输入中获取一个字符串Enter。
但是 select 正在触发stdin,因为它在被击中之前准备好读取Enter,并且在极少数情况下,在输入任何内容之前。这会挂起我的程序,getstr()
直到我点击Enter.
我尝试了设置nocbreak()
,它真的很完美,只是屏幕上没有回显,所以我看不到我在输入什么。设置echo()
不会改变这一点。
我也尝试过使用timeout(0)
,但结果更加疯狂并且没有用。
您需要做的是使用 getch() 函数检查字符是否可用。如果您在无延迟模式下使用它,该方法将不会阻塞。然后你需要吃掉这些字符,直到你遇到一个'\n',然后将每个字符附加到结果字符串中。
或者——我使用的方法——是使用 GNU readline 库。它支持非阻塞行为,但关于该部分的文档不是那么好。
此处包含一个您可以使用的小示例。它有一个选择循环,并使用 GNU readline 库:
#include <stdio.h>
#include <readline/readline.h>
#include <readline/history.h>
#include <stdlib.h>
#include <stdbool.h>
int quit = false;
void rl_cb(char* line)
{
if (NULL==line) {
quit = true;
return;
}
if(strlen(line) > 0) add_history(line);
printf("You typed:\n%s\n", line);
free(line);
}
int main()
{
struct timeval to;
const char *prompt = "# ";
rl_callback_handler_install(prompt, (rl_vcpfunc_t*) &rl_cb);
to.tv_sec = 0;
to.tv_usec = 10000;
while(1){
if (quit) break;
select(1, NULL, NULL, NULL, &to);
rl_callback_read_char();
};
rl_callback_handler_remove();
return 0;
}
编译:
gcc -Wall rl.c -lreadline