比特币源码研读(8)-main函数(7)
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)(http://www.jianshu.com/p/0df718dffdac)
紧接着就开始判断这个文件是否为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交易与操作、投资分析、风险分析等内容。