获取用户输入而不阻止无限循环

时间:2014-10-14 20:06:09

标签: c loops pthreads block user-input

我编写了一个简单的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;
}

3 个答案:

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