gpt4 book ai didi

select - ncurses和stdin阻止

转载 作者:行者123 更新时间:2023-12-01 16:22:46 24 4
gpt4 key购买 nike

我在select()集中设置了stdin,并且每当用户键入它并按Enter时,我都希望从stdin中获取一个字符串。

但是select会在按下Enter键之前(甚至在很少键入任何内容之前)触发stdin准备读取。这将我的程序挂在getstr()上,直到我按下Enter键为止。

我尝试设置nocbreak(),它非常完美,除了屏幕上没有任何回声,因此我看不到我在输入什么。设置echo()不会改变它。

我也尝试使用timeout(0),但是结果甚至更疯狂,无法正常工作。

最佳答案

您需要做的就是通过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

关于select - ncurses和stdin阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1706678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com