如何使readLine()超时

时间:2015-07-02 09:44:26

标签: c client readline libreadline

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

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

2 个答案:

答案 0 :(得分:1)

  

我正在使用readLine系统调用。

     

您提供的信息不一致。具有系统调用 readLine的系统是什么? 如果使用,则更倾向于调用库函数。但是,根据GNU Readline Library 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

答案 1 :(得分:-1)

如何使用它?我也试图找到与此线程相同的解决方案。 这些代码就可以了,但我不确定它没有问题。  如果有人发现它的问题或更好的解决方案,请告诉我。

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.