GNU Readline 可以处理多个流吗?
Posted
技术标签:
【中文标题】GNU Readline 可以处理多个流吗?【英文标题】:Can GNU Readline handle multiple streams? 【发布时间】:2021-07-02 03:07:46 【问题描述】:我正在构建一个使用GNU Readline
处理控制台输入的telnet 应用程序。当前的实现为每个新的客户端连接创建一个新的子进程 - 这会为每个子进程分配一个 readline
实例。
fork 类型的网络服务器不是最有效的,所以我想改用 poll/epoll,但为此必须将 readline
配置为使用多个流缓冲区和历史记录,每个客户端一个连接。
我阅读了GNU readline
文档以搜索此类配置,但没有找到。这可能吗,还是有某种readline
替代方案可以启用此功能?我应该放弃这个想法吗?
【问题讨论】:
担心交互式应用程序中的分叉效率?你想用它做什么,每秒按十亿个键?话虽如此,看here 也许你是对的。我认为 fork 足够高效,我对这种方法的担忧来自构建网络服务器的最佳实践,我读了很多,poll/epoll 是最佳选择的方法。 【参考方案1】:Readline 被记录为专门从终端读取。它没有记录的机制来同时维护多个输入的状态,而且您已经如履薄冰地使用它从实际上不是终端的流中读取。
此外,readline
的语义与多路复用样式服务不匹配,因为在每次调用时它都会阻塞,直到它可以读取完整的行。这根本不是一个可行的替代方案,也不是任何具有类似的一次一行阻塞行为的类似工作。
【讨论】:
感谢您的回答,我认为这解决了我的疑虑。我将继续使用我已经实施的内容。顺便说一句,GNU readline
提供了一种以非阻塞方式调用它的方法,它是rl_callback_read_char
。以上是关于GNU Readline 可以处理多个流吗?的主要内容,如果未能解决你的问题,请参考以下文章