比特幣有幾個客戶端,也就是由幾個入口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)
當然不能調過配置加載啦