【问题标题】:How to make readLine() timeout如何使 readLine() 超时
【发布时间】:2015-09-19 18:44:23
【问题描述】:

我的应用程序基本上是一个具有所有预期功能(如提示、历史记录等)的 CLI,它需要在 STDIN 上等待用户输入。为此,我正在使用 readLine 系统调用。我创建了一个网络套接字,用于将从用户读取的消息发送到服务器。我的应用程序是单线程的。因为我的应用程序被阻止用户输入,所以创建的套接字没有响应来自服务器的保持活动消息。我想知道是否有办法让 readLine 在一段时间后超时,这样我就可以轮询我的网络套接字并回来等待 readLine?。

我知道有一种解决方案可以让我生成一个线程来处理网络操作。但我不想让我的应用程序多线程。

【问题讨论】:

  • 如果你在谈论 GNU readline 你可以使用int rl_set_keyboard_input_timeout (int u)
  • @Filip:我尝试使用它,但它不起作用。可能是我没有以正确的方式做到这一点。你能给我一些链接吗?
  • 看起来可能需要 rl_catch_signals 和 rl_event_hook,不确定。

标签: c client readline libreadline


【解决方案1】:

我正在使用 readLine 系统调用。

您提供的信息不一致。具有系统调用 readLine 的系统会是什么?
如果你使用,你宁愿调用库函数。但是,根据 GNU Readline 库Function and Variable Index,没有函数readLine,只有readline。有了它,您可以使用

  • 变量: rl_hook_func_t * rl_event_hook
    如果非零,这是 Readline 等待时定期调用的函数的地址 用于终端输入。默认情况下,最多调用十次 如果没有键盘输入,则等待一秒钟。

    (您可以将其设置为轮询网络套接字并响应消息的函数)

或者

  • Alternate Interface
    普通readline() 可以使用备用界面。一些应用程序需要将键盘 I/O 与文件、设备或窗口系统 I/O 交错,通常通过在各种文件描述符上使用 select() 的主循环。为了满足这种需求,readline 也可以作为事件循环中的“回调”函数调用。有一些函数可以让这变得简单。

    有一个使用备用接口的示例程序:Alternate Interface Example

【讨论】:

    【解决方案2】:

    用这个怎么样?我也试图找到与这个线程相同的解决方案。 这些代码可以正常工作,但我不确定它没有问题。 如果有人发现它的错误或更好的解决方案,请告诉我。

    int event_hook(){
        rl_line_buffer[0] = '\0';
        rl_done = 1;
        return 0;
    }
    
    rl_event_hook = event_hook;
    rl_set_keyboard_input_timeout(500000);  // in usec
    char* line = readline(">");      // returns after 1s. I don't know why it takes double time that I set up.
    

    【讨论】:

    • 这是一个答案还是一个新问题?如果这是一个答案,请通过提供一些解释来说明清楚,否则你应该删除它并在新帖子中提问。
    猜你喜欢
    • 2011-12-26
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 2012-05-18
    • 2016-12-19
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多