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. stm32.cube介绍

    stm32.cube(一)——系统架构及目录结构 stm32.cube(二)——HAL结构及初始化 stm32.cube(三)——HAL.GPIO stm32.cube(四)——HAL.ADC stm ...

  2. Ubuntu/CentOS下使用脚本自动安装 Docker

    Ubuntu.Debian 系列安装 Docker 系统要求 Docker 支持以下版本的 Ubuntu 和 Debian 操作系统: Ubuntu Xenial 16.04 (LTS) Ubuntu ...

  3. CSS3实现水位充满文字特效

    CSS3实现水位充满文字特效是一款既是Loading特效也是文字特效,Loading动画开始时,文字中的水位渐渐上升,为了模拟水位上升的真实效果,水面还会波浪浮动,当Loading动画结束时,文字中的 ...

  4. vsftpd虚拟用户【公司系统部分享】

    一,安装相关工具包 #yum -y install pam vsftpd db4 db4-utils -- pam 是用来提供身份验证的 -- vsftpd 是ftp服务的主程序 -- db4支持文件 ...

  5. html5--1.14 特殊符号的使用

    html5--1.14 特殊符号的使用 学习要点: 实体的概念一个表格小实例 1.HTML 实体 在 HTML 中,某些字符是预留的. 在 HTML 中不能使用小于号(&lt)和大于号(&am ...

  6. 机器学习:Selective Search for Object Recognition

    今天介绍 IJCV 2013 年的一篇文章,Selective Search for Object Recognition,这个是后面著名的DL架构 R-CNN 的基础,后续介绍 R-CNN 的时候, ...

  7. STM32中IO口的8中工作模式

    该文摘自:http://blog.csdn.net/kevinhg/article/details/17490273 一.推挽输出:可以输出高.低电平,连接数字器件:推挽结构一般是指两个三极管分别受两 ...

  8. 【Lintcode】153.Combination Sum II

    题目: Given a collection of candidate numbers (C) and a target number (T), find all unique combination ...

  9. uC/OS-II源码分析(四)

    内核结构 1,  临界区,OS_ENTER_CRITICAL和OS_EXIT_CRITICAL 为了处理临界区代码,必须关中断,等处理完毕后,再开中断.关中断可以避免其他任务或中断进入临界区代码.uC ...

  10. AtCoder Grand Contest 002 F:Leftmost Ball

    题目传送门:https://agc002.contest.atcoder.jp/tasks/agc002_f 题目翻译 你有\(n*k\)个球,这些球一共有\(n\)种颜色,每种颜色有\(k\)个,然 ...