【问题标题】:libncurses: non-blocking STDIN + select on socketlibncurses:非阻塞 STDIN + 在套接字上选择
【发布时间】:2014-06-02 23:29:20
【问题描述】:

我正在使用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 问题。

【问题讨论】:

  • 没什么特别的。只需将STDIN_FILENO 添加到您的选择集即可。

标签: c sockets select curses


【解决方案1】:

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

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

【讨论】:

  • 在同一个循环中使用select作为套接字和getch作为STDIN会有什么问题吗?
  • @Jarrett:不,那很好,特别是如果你有一个单线程事件循环。如果您尝试在一个线程中进行输入并在另一个线程中进行屏幕显示,则可能会出现问题,因为getch 通常会进行一些屏幕显示,包括refresh
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-31
  • 2013-10-15
  • 2010-12-04
相关资源
最近更新 更多