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

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

作者: electroman | 来源:发表于2017-10-29 22:52 被阅读175次

    2)读取配置文件:读取配置文件,如果配置文件出错,则弹出错误提示框,并且程序退出

    try

    {

         gArgs.ReadConfigFile(gArgs.GetArg("-conf",BITCOIN_CONF_FILENAME));

    }

    catch (const std::exception&e)

    {

         fprintf(stderr,"Error reading configuration file: %s\n",e.what());

         returnfalse;

    }

    该函数流程图如下:

    分析1:BITCOIN_CONF_FILENAME,宏定义在util.cpp文件中,定义如下:

    const char * const

    BITCOIN_CONF_FILENAME = "bitcoin.conf";

    bitcoin.conf是客户端的配置文件,位置是bitcoin/contrib/init,该文件定义了很多env,如下

    env BITCOIND_BIN="/usr/bin/bitcoind"

    env BITCOIND_USER="bitcoin"

    env BITCOIND_GROUP="bitcoin"

    env BITCOIND_PIDDIR="/var/run/bitcoind"

    envBITCOIND_PIDFILE="/var/run/bitcoind/bitcoind.pid"

    envBITCOIND_CONFIGFILE="/etc/bitcoin/bitcoin.conf"

    env BITCOIND_DATADIR="/var/lib/bitcoind"

    分析2:GetArg函数

    由函数可以看出,如果找到conf文件,则用这个conf文件,如果没有找到,则用默认文件。

    分析3:ReadConfigFile

    voidArgsManager::ReadConfigFile(const std::string& confPath)

    {

         fs::ifstream streamConfig(GetConfigFile(confPath));

         if (!streamConfig.good())

        return; // No bitcoin.conf file is OK

    {

    LOCK(cs_args);

    std::set setOptions;

    setOptions.insert("*");

    for(boost::program_options::detail::config_file_iterator it(streamConfig,setOptions), end; it != end; ++it)

    {

    // Don't overwrite existingsettings so command line settings override bitcoin.conf

    std::string strKey =std::string("-") + it->string_key;

    std::string strValue =it->value[0];

    InterpretNegativeSetting(strKey,strValue);

    if (mapArgs.count(strKey) == 0)

    mapArgs[strKey] = strValue;

    mapMultiArgs[strKey].push_back(strValue);

    }

    }

    // If datadir is changed in .conf file:

    ClearDatadirCache();

    }

    fs::ifstream把硬盘上的文件读取到内存中,定义一个文件流streamConfig

    ifstream的详细解释见:http://www.cplusplus.com/reference/fstream/ifstream/

    streamConfig读取的文件是GetConfigFile(confPath),我们再看看这个函数:

    fs::pathGetConfigFile(const std::string& confPath)

    {

    fs::path pathConfigFile(confPath);

    if (!pathConfigFile.is_complete())

    pathConfigFile = GetDataDir(false) /pathConfigFile;

    return pathConfigFile;

    }

    读取confPath,也就是BITCOIN_CONF_FILENAME文件,判断文件是否完整,如果不完整则读取默认的配置文件,GetDataDir函数见比特币源码研读(7)-main函数(6)

    紧接着就开始判断这个文件是否为conf文件,如果不是则直接退出

    if(!streamConfig.good())

    return; // No bitcoin.conf file is OK

    如果判断文件正常,开始执行for循环,读取配置文件的信息,写到mapArgs和mapMultiArgs中。

    最后,清空文件路径:函数最后是为防止配置文件中设置了数据目录参数datadir,通过ClearDatadirCache()函数将数据文件路径参数设置为空目录,这样下次进入GetDataDir()时,我们将会根据新的datadir创建数据目录。

    // If datadir is changed in .conffile:

    ClearDatadirCache();

    /////////////////////////////////////////////////读取配置文件函数分析完毕///////////////////////////////////////

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

    以下是广告:

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

    相关文章

      网友评论

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

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