EOS版本:4.0

 
一.进程cleos的作用
 
cleos,即为client eos。从名字就可以猜出来,它是一个标准的客户端程序,而实际上,它也确实为一个标准的client^_^
 
准确地说,它具有以下几个特点:
 
  • 它是一个标准的命令行解析器,类似于linux操作系统的终端,它同样具有强大的扩展功能。
  • 它不存在数据库,所有它需要的数据,都是通过http协议去连接nodeos和keosd(这两个进程都有http的监听端口),通过反射机制拿到自己想要的数据再进行逻辑运算并把执行的结果显示出来。
  • 不支持多条命令同时下发(个人见解)。
 
二.源码解析
 
与往常一样,我们从cleos的main开始,都是一些配置文件的路径设置或者初始化数据的读取。配置完后,主角上场了,核心类class App。为了方便理解,画一个草图,如下:
 
 
上面的每一个椭圆就是一个类App的对象,黄色箭头代表指针,很明显,cleos就相当于root了,有了这个概念就很简单了,看源码吧,如下:
 
 
声名第一个App类的对象,相当于cleos,再看指针,通过App的成员函数add_subcommand()实现,成功地实现了链表
 
注意最后返回的变量subcommands_是一个vector类型,使它摇身一变,变成一棵任意生长叶子的树结构:

 
两个操作就形成了强大的扩展功能,再下面就是给类App加点肥料,让它长的更健壮,更强大,强将手下无弱兵,看看它强大的成员函数吧:
 
NO1 add_option
 
此函数有五个重载版本……,截一个为例,看看它的用法,就是把命令参数的解析和具体的变量或者函数关联起来,即第二个参数,又放到
 
调用方式:
 
实现:

 
注意中间有个就是options_,为App的成员变量,有了它,让每个对象可以扩展无限的配置选项
 
这里的Option类应该是由boost::option改写而成,可以先参考下boost中关于option的资料,再回头看看里面的实现。
 
到这里,相当于把命令的选项参数全部加入了App对象的options_变量中,这个操作打80分。
 
NO2 set_callback
 
每一条命令执行的函数,这里先注册再使用,把命令和函数关联起来,实现很简单,给每个App关联了一个回调。
 
基本框架搭好了,就这么简单。那么还有一个问题就是,这么多参数怎么校验呢?上图:
 
言简意赅:校验,解析,执行,先看校验
 
 
意思是:检查当前命令所有构建的App对象中的成员变量options_的参数是不是与定义的一致,如果不一致,直接抛出异常终止运行。熟悉了框架,命令的解析和回调就很简单了,主要有以下一点:
 
  • 命令字分为NONE, POSITIONAL_MARK, SHORT, LONG, SUBCOMMAND这五种。NONE为后面不接任何参数,SHORT为短命令格式(-开头),LONG长命令(--开头),SUBCOMMAND后面接子命令(不带上面的特殊符号)

源码分析(一) 进程cleos的命令解析的更多相关文章

  1. 鸿蒙内核源码分析(特殊进程篇) | 龙生龙,凤生凤,老鼠生儿会打洞 | 百篇博客分析OpenHarmony源码 | v46.02

    百篇博客系列篇.本篇为: v46.xx 鸿蒙内核源码分析(特殊进程篇) | 龙生龙凤生凤老鼠生儿会打洞 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁 ...

  2. SpringMVC源码分析6:SpringMVC的视图解析原理

    title: SpringMVC源码分析6:SpringMVC的视图解析原理 date: 2018-06-07 11:03:19 tags: - SpringMVC categories: - 后端 ...

  3. Dubbo源码分析之ExtensionLoader加载过程解析

    ExtensionLoader加载机制阅读: Dubbo的类加载机制是模仿jdk的spi加载机制:  Jdk的SPI扩展加载机制:约定是当服务的提供者每增加一个接口的实现类时,需要在jar包的META ...

  4. RecyclerView 源码分析(一) —— 绘制流程解析

    概述 对于 RecyclerView 是那么熟悉又那么陌生.熟悉是因为作为一名 Android 开发者,RecyclerView 是经常会在项目里面用到的,陌生是因为只是知道怎么用,但是却不知道 Re ...

  5. 内核源码分析之进程地址空间(基于3.16-rc4)

    所谓进程的地址空间,指的就是进程的虚拟地址空间.当创建一个进程时,内核会为该进程分配一个线性的地址空间(虚拟地址空间),有了虚拟地址空间后,内核就可以通过页表将进程的物理地址地址空间映射到其虚拟地址空 ...

  6. mybatis源码分析(二)------------配置文件的解析

    这篇文章中,我们将讲解配置文件中 properties,typeAliases,settings和environments这些节点的解析过程. 一 properties的解析 private void ...

  7. MXNet源码分析 | KVStore进程内通信

    本文主要基于MXNet1.6.0版本进行分析. MXNet的KVStore模块下有几个比较重要的类.KVStore是一个抽象类,提供了一些通用的API,例如Init.Push和Pull等.因为KVSo ...

  8. linux-2.6.18源码分析笔记---进程

    一.进程重要字段描述 在目录include\linux\sched.h下定义了进程描述符task_struct,关注如下字段: 进程状态 volatile long state:表示进程状态,在该文件 ...

  9. linux调度器源码分析 - 新进程加入(三)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 之前的文章已经介绍了调度器已经初始化完成,现在只需要加入一个周期定时器tick驱动它进行周期调度即可,而加 ...

随机推荐

  1. git format-patch的使用【转】

    本文转载自:http://blog.chinaunix.net/uid-28621021-id-3487102.html git format-patch的使用   1.在dev1分支上,打出所有de ...

  2. 吴恩达机器学习笔记(九) —— 异常检测(Anomaly detection)

    主要内容: 一.模型介绍 二.算法过程 三.算法性能评估及ε(threshold)的选择 四.Anomaly detection vs Supervised learning 五.Multivaria ...

  3. SpringBoot之外部Tomcat运行Spring Boot项目

    内置tomcat8.5.28 外置的要高于此版本才OK spring boot1.5是访问不了jsp页面的 以后要以2.0版本为主流的

  4. css3图书3D动画

    css3图书3D动画,css3,立体特效,旋转效果,3D动画,css3图书3D动画是一款基于css3实现的立体旋转3D图书动画特效. 代码下载页:http://www.huiyi8.com/sc/71 ...

  5. POJ 3071 Football:概率dp

    题目链接:http://poj.org/problem?id=3071 题意: 给定n,有2^n支队伍参加足球赛. 给你所有的p[i][j],表示队伍i打败队伍j的概率. 淘汰赛制.第一轮(1,2)两 ...

  6. Proftpd mysql认证配置文档

    Proftpd mysql认证配置文档 ver1.0, 2012/09/25 一.下载安装proftp mysql 下载 wget http://cloud.github.com/downloads/ ...

  7. 分享知识-快乐自己:intellij Idea报错Could not autowire. No beans of...

    intellig idea 使用@Resource或者@Autowire报错,出现红色波浪线: 虽然不影响使用,但是看着很不爽,所以还是解决了下: 报错提示: Could not autowire. ...

  8. Java企业微信开发_12_异常:java.lang.OutOfMemoryError: Java heap space

    一.异常现象 今天客户迁到正式环境,在做企业微信 接收消息服务器配置  时,出现如下异常: java.lang.OutOfMemoryError: Java heap space 二.异常原因 JAV ...

  9. T57

    “期待使我产生了介于幸福与恐惧之间的激动”The anticipation produced in me a sensation somewhat between bliss and fear他猛一下 ...

  10. linux 进程学习笔记-进程ID,PID

    PID,进程号 , 范围在2~(??为什么需要这么多),而一个名为idle (或swapper)的进程占据的编号0,init进程占据了编号1. 进程0和进程1 : 系统启动时会从无到有地创建进程0,它 ...