1

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

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

4

2 回答 2

1

我正在使用 readLine 系统调用。

您提供的信息不一致。那将是什么系统具有系统调用 readLine
如果你使用,你宁愿调用库函数。但是,根据 GNU Readline 库函数和变量索引,没有函数readLine,只有readline. 有了它,您可以使用

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

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

或者

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

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

于 2015-11-19T12:57:11.200 回答
0

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

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.
于 2019-11-11T06:01:01.780 回答