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. packstack快速安装

    1 安装软件库 更新安装的软件包,命令如下: sudo yum update -y 建立RDO库,命令如下: sudo yum install -y https://rdo.fedorapeople. ...

  2. cdcqの省选膜你赛 题解

    题解: 第一题: 有一个很明显的性质:后面的修改不会对前面的询问做出影响,CDQ分治套上BIT即可. 第二题: 有一个类似于斜率的形式,分数规划套上树分治,码量稍大,细节稍多. 最后20W的点出题人原 ...

  3. 20145239 实验一 Java开发环境的熟悉(Windows + IDEA)

    实验一 Java开发环境的熟悉(Windows + IDEA) 实验内容 1.使用JDK编译.运行简单的Java程序:2.使用Eclipse 编辑.编译.运行.调试Java程序. 实验知识点 1.JV ...

  4. POJ3294 Life Forms —— 后缀数组 最长公共子串

    题目链接:https://vjudge.net/problem/POJ-3294 Life Forms Time Limit: 5000MS   Memory Limit: 65536K Total ...

  5. 安装NXNET

    cran <- getOption("repos") cran["dmlc"] <- "https://s3-us-west-2.amaz ...

  6. hdmap相关单词

    交叉口(junction) 交叉口组(junctiongroup)

  7. unreal network

    frame move buffer: save move position recive server sync:All moves earlier than the ClientAdjustPosi ...

  8. 在Tabbed Activity(ViewPager)中切换Fragment

    我用Android Studio的向导新建了一个Tabbed Activity,里面是ViewPager样式的,有三个tabs.如下: 但是我尝试在第一个tab中设置一个按钮,打开其他tab的时候,却 ...

  9. ZOJ1905Power Strings (KMP||后缀数组+RMQ求循环节)

    Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc&quo ...

  10. ACM学习历程—BestCoder 2015百度之星资格赛1004 放盘子(策略 && 计算几何)

    Problem Description 小度熊喜欢恶作剧.今天他向来访者们提出一个恶俗的游戏.他和来访者们轮流往一个正多边形内放盘子.最后放盘子的是获胜者,会赢得失败者的一个吻.玩了两次以后,小度熊发 ...