我的应用程序基本上是一个具有所有预期功能的CLI,如提示,历史记录等,它需要在STDIN上等待用户输入。为此我使用readLine系统调用。我有一个创建的网络套接字,用于将从用户读取的消息发送到服务器。我的应用程序是单线程的。由于我的应用程序被阻止用户输入,因此创建的套接字不响应来自服务器的保持活动消息。我想知道是否有一种方法在一段时间后使readLine超时,以便我只在我的网络套接字上轮询并返回等待readLine?。
我知道有一个解决方案,我可以生成一个线程来处理网络操作。但我不想让我的应用多线程。
答案 0 :(得分:1)
我正在使用readLine系统调用。
您提供的信息不一致。具有系统调用 readLine
的系统是什么?
如果使用libreadline,则更倾向于调用库函数。但是,根据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.