我编写了一个简单的C程序,它基本上包含一个向上计数的无限循环。在循环期间,用户被要求输入 - 这里有一个棘手的部分:在等待用户时不应阻止循环,但是一进入就显示他的输入:
int main(void){
int i;
char dec;
for(;;i++){
printf("%d\n", i);
sleep(5);
if(i==4 || i==8){
printf("Please enter Y or N\n");
dec = fgetc(stdin);
printf("%c\n", dec);
}
}
return 0;
}
我在这里找到了一个类似Python的问题Python。那么我是否需要使用pthread将用户交互推送到新线程中,还是有更简单的选择?
谢谢!
修改
int main(void){
int i=0;
char dec;
fd_set input_set;
for(;;i++){
printf("%d\n", i);
sleep(2);
if(i==4 || i==8){
FD_ZERO(&input_set ); /* Empty the FD Set */
FD_SET(0, &input_set); /* Listen to the input descriptor */
dec = select(1, &input_set, NULL, NULL, 0);
}
}
return 0;
}
答案 0 :(得分:1)
只有系统相关库才能实现您想要做的事情。例如,在Unix上,如果他们按下按钮,你通常会使用ncurses来获取用户。
它与系统相关的原因是异步IO不适用于所有文件系统流。特别是用户I / O块和那个块是不可避免的。
如果您致力于使用仍然使用读/写系统调用的多线程程序,则需要有两个线程,一个用于I / O,另一个用于其他所有线程。在其他所有线程上,您可以查询一些共享内存区域,并查看I / O线程是否已将正确类型的数据写入此共享内存区域。
答案 1 :(得分:1)
如果您只使用Linux,请查看此SO帖子:What are the differences between poll and select?
如果您同时使用和/或已经有pthread,那么请使用单独的线程。
答案 2 :(得分:0)
如果您使用的是Windows,也许可以尝试使用键盘钩子。见SetWindowsHookEx。 它将通过回调捕获所有键盘点击。
如果你正在使用Linux,也许你可以使用它:Non-blocking keyboard read - C/C++