比特币有几个客户端,也就是由几个入口main函数
先从bitcoin.cpp的main函数分析
int main(int argc, char* argv[])
{
#ifdef WIN32
util::WinCmdLineArgs winArgs;
std::tie(argc, argv) = winArgs.get();
#endif
SetupEnvironment();
// Connect bitcoind signal handlers
noui_connect();
return (AppInit(argc, argv) ? EXIT_SUCCESS : EXIT_FAILURE);
}
非常简短的入口函数:
首先是 SetupEnvironment();
这个函数的作用是设置一下内存申请和释放方式
mallopt(M_ARENA_MAX, 1)是malloc的底层函数。
第一个参数控制内存的行为。比如说你申请一个大于1M空间的数据,malloc会调用操作系统提供的接口申请更大的空间。delete的时候并没有还给操作系统。详细信息查相关文档
第二个函数是 noui_connect();
点进去一看是这样的
void noui_connect()
{
uiInterface.ThreadSafeMessageBox_connect(noui_ThreadSafeMessageBox);
uiInterface.ThreadSafeQuestion_connect(noui_ThreadSafeQuestion);
uiInterface.InitMessage_connect(noui_InitMessage);
}
这三个boost库中的信号槽机制。先说功能。
用于输出日志的程序运行等错误信息。
当将来调用uiInterface.ThreadSafeQuestion_connect()
的时候这些信号都会触发。
回到入口函数static bool AppInit(int argc, char* argv[])
InitInterfaces interfaces;
interfaces.chain = interfaces::MakeChain();
首先初始化一个Initinterfaces里面的chain
struct InitInterfaces
{
std::unique_ptr<interfaces::Chain> chain;
std::vector<std::unique_ptr<interfaces::ChainClient>> chain_clients;
};
这个chain里面有一个lock接口类里还有一个Notifications类。里面有很多很重要的接口。比如说根据hash查找区块等。
然后mainchain()调用makeunique
std::unique_ptr<T> MakeUnique(Args&&... args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
ChainClient就是继承chain的子类。返回一个ChainClient的智能指针
总结:就是利用传入的命令行参数作为chainclient的构造函数参数初始化chainclient
接下来到另外一个函数了
SetupServerArgs();
这个函数内容相当大。总的来说就是设置一系列环境。加载配置文件等等。加载之后才进入主函数
bool AppInitMain(InitInterfaces& interfaces)
当然不能调过配置加载啦
网友评论