我在select()
集合中有 stdin ,每当用户输入 stdin 时,我都想从 stdin 获取一个字符串并点击 Enter
但是选择是在 Enter 被击中之前触发 stdin 准备阅读,并且在极少数情况下,在输入任何内容之前。这会将我的程序挂起getstr()
,直到我点击 Enter 。
我尝试设置nocbreak()
并且它确实非常完美,除了没有任何内容回显到屏幕上,所以我看不到我在键入的内容。设置echo()
不会改变它。
我也尝试过使用timeout(0)
,但结果更加疯狂,无效。
答案 0 :(得分:1)
您需要做的是检查getch()函数是否有可用的字符。如果在无延迟模式下使用它,则该方法不会阻止。然后你需要吃掉字符,直到你遇到'\ n',然后在你去的时候将每个字符附加到结果字符串上。
或者 - 我使用的方法 - 是使用GNU readline库。它支持non-blocking behavior,但有关该部分的文档并不是那么出色。
这里包含一个您可以使用的小例子。它有一个select循环,并使用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