ncurses和stdin阻塞

时间:2009-11-10 09:36:19

标签: select stdin blocking ncurses curses

我在select()集合中有 stdin ,每当用户输入 stdin 时,我都想从 stdin 获取一个字符串并点击 Enter

但是选择是在 Enter 被击中之前触发 stdin 准备阅读,并且在极少数情况下,在输入任何内容之前。这会将我的程序挂起getstr(),直到我点击 Enter

我尝试设置nocbreak()并且它确实非常完美,除了没有任何内容回显到屏幕上,所以我看不到我在键入的内容。设置echo()不会改变它。

我也尝试过使用timeout(0),但结果更加疯狂,无效。

1 个答案:

答案 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