http://gonggeng.org/mediawiki/index.php/Readline-select

Readline-select

一个交互式命令行程序必然包含从终端读取命令执行命令这样的循环。 为了提供像重新调用上一次命令这样的丰富的命令行编辑功能,我们一般会使用 GNU 的 readline 库。 通常我们会这样来编程:

#include <readline/readline.h>
#include <readline/history.h>int
main (int argc, char **argv)
{char *line_read = 0;while (1) {if (line_read){free (line_read);line_read = (char *)NULL;}line_read = readline ("ccnet> ");/* If the line has any text in it, save it on the history. */if (line_read && *line_read) {add_history (line_read);handle_command (line_read);}}
}

但是如果我们有多个 IO 要处理,比如既要从一个网络 IO 中读数据,又要从标准输入中读取命令,上面的方法就不合适了。

为了解决这个问题,我们需要自己用 select 函数监控这两个 IO,当它们可读的时候通知这两个模块中的输入函数。形象地说,就是把数据“喂给”这两个模块。这样的模式需要 readline 提供“被动喂给”的工作方式。这种工作方式在 readline 中已有实现。

首先,我们需要往 readline 注册回调函数,当 readline 读取到一行后,这个回调函数将被调用:

  rl_callback_handler_install ("prompt> ", handle_command);

接下去,在主事件循环中,我们需要调用 rl_callback_read_char() 通知 readline 去读取一个字符。

下面给一个例子:

static void handle_command (char *line)
{...
}int
main (int argc, char **argv)
{int netfdfd_set allfd;int maxfd;netfd = connect_to_server ();FD_ZERO (&allfd);FD_SET (0, &allfd);FD_SET (netfd, &allfd);maxfd = netfd;rl_callback_handler_install ("ccnet> ", handle_command);while (1) {fd_set rfds;int retval;rfds = allfd;retval = select (maxfd + 1, &rfds, NULL, NULL, NULL);if (retval < 0)perror ("select");if (FD_ISSET(0, &rfds))rl_callback_read_char();if (FD_ISSET(netfd, &rfds))read_from_network (netfd);}
}

参考

info readline 2.4.12 Alternate Interface

Readline-select相关推荐

  1. hmailserver批量添加用户

    2019独角兽企业重金招聘Python工程师标准>>> 将内容复制到txt文件中后缀改为vbs 将用户名密码替换为自己的 脚本内容如下: Option Explicit On Err ...

  2. jeee的基础知识(转载)

    Servlet: 1)servlet : servlet是一个特殊的java程序,需要在web服务器上运行,并接收和响应客户端的请求,遵循http协议. 2)Servlet;作用: 主要用于控制层. ...

  3. 批量添加用户 php,hmailserver批量添加用户

    将内容复制到txt文件中后缀改为vbs 将用户名密码替换为自己的 脚本内容如下: Option Explicit On Error resume next Dim obBaseApp Dim objF ...

  4. ORACLE-SQL较全面笔记

    -- 首先,以超级管理员的身份登录oracle        sqlplus sys/bjsxt as sysdba        --然后,解除对scott用户的锁        alter use ...

  5. linux select与多进程的结合

    服务器模型-之select多进程模型 比较好的一个将select与多进程结合的模型 可以利用select来监听多个类型的描符号,包括不同类型的socket描述符,如:TCP套接口描述符,UDP套接口描 ...

  6. 0730------Linux网络编程----------服务器端模型(迭代,多进程,多线程,select,poll,epoll 等)...

    1.迭代服务器模型 1.1 迭代服务器是处理多个请求时一种最简单直接的思路,即使用while循环,它不具有并发能力,即必须一个一个的处理客户的请求. 1.2 程序示例. #include " ...

  7. 网络编程学习笔记(使用select函数的TCP和UDP回射服务器程序)

    一开始,创建完TCP后,没有用listen监听.启动服务器后,再启动TCP客户端,前几次总是打印readline error:success.后面就恢复正常了 服务器端: #include <s ...

  8. 0729------Linux网络编程----------使用 select 、poll 和 epoll 模型 编写客户端程序

    1.select 模型 1.1 select 函数原型如下,其中 nfds 表示的描述符的最大值加1(因为这里是左闭右开区间),中间三个参数分别表示要监听的不同类型描述符的集合,timeout用来表示 ...

  9. 1高并发服务器:多路IO之select

     1 select A:select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开 的文件描述符个数并不能改变select监听文件个数 B:解决1024以下客户 ...

  10. Linux下I/O多路转接之select --fd_set

    fd_set 你终于还是来了,能看到这个标题进来的,我想,你一定是和我遇到了一样的问题,一样的疑惑,接下来几个小时,我一定竭尽全力,写出我想说的,希望也正是你所需要的: 关于Linux下I/O多路转接 ...

最新文章

  1. 深度卷积生成对抗网络
  2. 每日一皮:程序员的神逻辑...
  3. ESLint 规则详解
  4. 通过编程解决问题的正确思路
  5. (摘录)sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
  6. ac2100 反弹shell无法粘贴_记一次突破反弹shell
  7. LCN分布式事务框架实战
  8. JS将各值拼接JSON串小例
  9. KubeEdge 1.1 部署
  10. 未来 10 年,物联网将成为主流!
  11. 九小时九个人九扇门(01背包)
  12. 输出结果 配置_用单端仪表放大器实现全差分输出
  13. 【C 语言】文件操作 ( fseek 函数 )
  14. [机器学习、Spark]Spark机器学习库MLlib的概述与数据类型
  15. Spring boot项目集成阿里云短信服务发送短信验证码
  16. 荔枝派Nano 全流程指南
  17. dnf时装补丁教程_DNF补丁教程:就 是 这 么 简 单
  18. 使用数字万用表来检测电子元器件的时候需注意的几点
  19. 天线接收功率计算公式_无线发射功率以及接收灵敏度
  20. 1977年发生事件_历史回放:日本1977年海怪尸体事件

热门文章

  1. 电脑CPU依然得看英特尔酷睿:新一代性能提升20%,AI能力翻5倍;网友:感谢AMD...
  2. 中文分词最佳记录刷新了,两大模型分别解决中文分词及词性标注问题丨已开源...
  3. 华为Mate 30系列发布:电影级4摄,麒麟990 5G,没谷歌全家桶,售价高于iPhone11
  4. jQuery操作input
  5. Docker 是什么?
  6. Node.js建站笔记-使用react和react-router取代Backbone
  7. 速读《构建之法:现代软件工程》提问
  8. 【08】Effective Java - 异常
  9. 【新手教程】如何向App Store提交应用
  10. 福师计算机导论在线作业一,福师《计算机导论》在线作业一..doc