美文网首页区块链研习社
比特币源码研读(7)-main函数(6)

比特币源码研读(7)-main函数(6)

作者: electroman | 来源:发表于2017-10-18 10:07 被阅读129次

    识别完帮助信息和版本信息以后,下面是对异常时间的处理

    try{

    //保护代码

    }

    catch (const std::exception& e) {

    PrintExceptionContinue(&e, "AppInit()");

    }

    catch (...) {

    PrintExceptionContinue(nullptr, "AppInit()");

    }

    即如果try中的代码出现异常,则会被catch捕获。在这里我们先分析try中的“保护代码”

    1)判断目录是否正确:如果目录不正确,则弹出对话框,提示数据目录不存在,并退出软件

    if(!fs::is_directory(GetDataDir(false)))

    {

    fprintf(stderr, "Error: Specified data directory \"%s\"does not exist.\n", gArgs.GetArg("-datadir", "").c_str());

    returnfalse;

    }

    if语句中fs定义是

    namespace fs = boost::filesystem;

    filesystem库是一种可移植的文件系统操作库,可以跨平台的操作目录、文件等,filesystem库的所有内容定义在boost名字空间的一个下级名字空间里,它叫boost::filesytem。这里介绍几个代码中用到的函数。

    boost::filesystem::path path("");//初始化

    boost::filesystem::is_directory(file_path)//判断file_path是否为目录。

    /**********GetDataDir()函数分析****************************/

    GetDataDir函数流程图

    总体来说:

    如果有path路径,则直接返回这个路径;

    如果没有,则查看参数gArgs中是否设置了路径,如果设置且正确(如果设置的是网络目录,则转换成本地路径),则在本地创建这个路径,并返回路径;如果设置但错误,则清空path,返回空目录;

    其中的函数说明:

    函数1,L558

    pathCached ,pathCachedNetSpecific定义在util.cpp中,如下

    void ClearDatadirCache()

    {

    LOCK(csPathCached);

    pathCached =fs::path();

    pathCachedNetSpecific = fs::path();

    }

    函数2, L566

    path =fs::system_complete(gArgs.GetArg("-datadir", ""));

    转化路径为完整路径,详见

    https://msdn.microsoft.com/en-us/library/hh874650(v=vs.120).aspx

    函数3,L572

    GetDefaultDataDir()

    定义在util.cpp.返回默认路径,那默认路径是什么呢?

    // Windows

    // Windows >= Vista:C:\Users\Username\AppData\Roaming\Bitcoin

    // Mac:~/Library/Application Support/Bitcoin

    // Unix:~/.bitcoin

    函数4,L 575

    BaseParams().DataDir();

    其中BaseParams函数定义在chainparamsbase.cpp文件,函数定义如下

    const CBaseChainParams& BaseParams()

    {

    assert(globalChainBaseParams);

    return*globalChainBaseParams;

    }

    返回的是*globalChainBaseParams,定义也在这个文件里,

    static std::unique_ptrglobalChainBaseParams;

    由定义可以看出,BaseParams是类CBaseChainParams,我们看看类CBaseChainParams

    class CBaseChainParams

    {

    public:

    /** BIP70 chainname strings (main, test or regtest) */

    static conststd::string MAIN;

    static conststd::string TESTNET;

    static conststd::string REGTEST;

    conststd::string& DataDir() const { return strDataDir; }

    int RPCPort()const { return nRPCPort; }

    protected:

    CBaseChainParams() {}

    int nRPCPort;

    std::stringstrDataDir;

    };

    其中,可以看到DataDir()函数定义:

    const std::string& DataDir() const { returnstrDataDir; }

    定义在chainparamsbase.cpp中:

    const std::string& DataDir() const { returnstrDataDir; }

    //类注释中,我们可以看到BIP70,说明这个改进协议BIP70中应用到的。

    /**********GetDataDir()函数分析结束****************************/

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    steemit,每个写作者的另一片天地,去看看吧!

    https://steemit.com/btc/@electroman/7-main-6

    区块链研习社比特币源码研读班  electroman

    以下是广告:

    我们区块链研习社已创建“区块链研习社币圈交流”小密圈”,在小密圈中,我们将带领大家一起学习区块链的原理与投资,还将提供区块链基本原理解答、交易所注册与交易操作、ICO交易与操作、投资分析、风险分析等内容。

    相关文章

      网友评论

        本文标题:比特币源码研读(7)-main函数(6)

        本文链接:https://www.haomeiwen.com/subject/ccssuxtx.html