libncurses:在socket上无阻塞STDIN + select

时间:2014-06-02 23:29:21

标签: c sockets select curses

我正在使用select从套接字和STDIN进行非阻塞读取。在伪代码中:

loop
  readable = select(socket, STDIN)
  foreach input in readable
    if input == STDIN
      handle_keyboard_input(read(STDIN))
    else
      handle_socket_input(read(socket))

以上作品很棒。但是现在我想开始使用libncurses构建一个更复杂的基于文本的UI。 (我可能有两个窗口:一个大的日志窗口和一个较小的窗口用于提示。)

据推测,套接字处理将保持不变。但我不清楚libncurses如何抽象出STDIN。在libncurses窗口中进行非阻塞读取的正确习惯是什么?

实际上这是在Ruby中,但我只是在C API周围使用瘦包装器,所以我觉得这更适合标记为C问题。

1 个答案:

答案 0 :(得分:2)

基本上,当您调用ncurses等输入函数时,getch仅从其输入流中读取。所以在这种程度上,ncurses并没有抽象出任何东西;它所做的只是关联两个文件描述符,一个用于输入,一个用于输出,每个SCREEN。有关详细信息,请参阅man newterm

如果您致电nodelay或使用timeout/wtimeout将超时设置为0,那么如果相应窗口没有待处理的输入,getch将立即返回错误。这基本上只需要编写异步输入处理(就ncurses而言。)如果你想使用select循环,你需要处理调度后台任务的机制,等等ncurses对多线程应用程序有基本的支持,如果你想走那条路。