【比特币源码分析】————4、初始化操作&参数解析

接下来就是应用程序的初始化了:

【比特币源码分析】————4、初始化操作&参数解析_第1张图片

应用程序初始化AppInit

AppInit函数是main函数执行的最后一个过程,我们通过该函数的注释(Start)以及AppInit函数的参数为main函数中的参数可知,其代表的是整个比特币后台进程真正开始运行的入口。

【比特币源码分析】————4、初始化操作&参数解析_第2张图片

【比特币源码分析】————4、初始化操作&参数解析_第3张图片

从上面我们可以看到,首先是定义了一个Initinterfaces的对象 interfaces,从字面上理解的话是一个初始化的接口对象。对于“InitInterfaces”在src/init.h中有定义:

【比特币源码分析】————4、初始化操作&参数解析_第4张图片

在后面可以看到调用了一个SetupServerArgs()函数,这个函数的定义在init.cpp中的357行:

【比特币源码分析】————4、初始化操作&参数解析_第5张图片

从上面可以看到主要是一些服务器端的参数匹配。

参数解析

【比特币源码分析】————4、初始化操作&参数解析_第6张图片

ParseParameters函数在system.cpp中:

【比特币源码分析】————4、初始化操作&参数解析_第7张图片

该函数的第一行代码为LOCK(cs_args);我们先看看LOCK是什么东东:

【比特币源码分析】————4、初始化操作&参数解析_第8张图片

从上面的逻辑中我们可以看到lock是一个宏定义,该处的lock就是一个互斥锁的功能,防止后续代码中涉及的全局变量被不同线程抢夺。

版本信息

下面的代码是版本信息和命令使用的帮助信息查看:

【比特币源码分析】————4、初始化操作&参数解析_第9张图片

数据目录

之后是数据目录查看:

if语句中判断了GetDataDir(false)函数返回的数据路径是否为目录名称,如果不是,则打印指定目录不存在的错误提示信息,并且因为数据目录不正确,而导致比特币核心程序无法正常运行,所以返回false,程序退出。所以,数据目录是否正确的关键在于GetDataDir(false)函数获取的目录信息的正确性。那我们来看GetDataDir函数的具体实现。该函数的实现可以在system.cpp中找到:

【比特币源码分析】————4、初始化操作&参数解析_第10张图片

具体实现流程:

【比特币源码分析】————4、初始化操作&参数解析_第11张图片

流程图中的第2步和第3步,程序中对GetDataDir(false)函数传入的参数为false,即使用本地文件目录,如果未设置“-datadir”参数,程序将执行流程图中的GetDefaultDataDir函数,该函数的实现也位于system.cpp中。

在该函数中我们可以获得比特币后台进程在Windows、Mac以及unix等操作系统下的默认数据目录。具体如下:

【比特币源码分析】————4、初始化操作&参数解析_第12张图片

第4步中,程序判断是否为网络目录,如果是在执行第5步,在第5步中我们将获得Path中的BaseParams.DataDir()目录,该目录的定义在chainparamsbase.h中有具体实现。

第6步通过fs::create_directories(path);创建数据目录。

第7步返回创建的数据目录,此时程序通过GetDataDir(false)函数获得了数据目录路径,如果路径信息正确且存在,程序将继续运行,否则前文所述,程序将停止运行,返回false。

你可能感兴趣的:(【区块链】,————比特币源码研究分析)