比特币源码研读(1)——设置运行环境

前言:

对于我这个刚学了几天C++的菜鸟来说,马上上手学习比特币的源码是有一定难度。但是既然加入区块链研习社比特币源码研读班,哭着也要坚持下去。
通过这两周的学习,均益发现不要着急研读比特币的源码。可以先从《精通比特币》、《比特币开发者指南》这两本书入手,对比特币有了一个大概的了解之后,学习起来会容易不少。虽然也是很困难,哭脸!
下面这个图,是比特币运行图。只是现在还不完整,可能也有不少错误,不过随着学习的深入,均益也会跟着修改。以后会一直更新比特币源码研读的文章。主要是笔记,记录个人的思考的过程,踩过的坑,让大家少踩点坑。如果文中有什么问题,也请读者朋友们指出,谢谢!

  1. 比特币核心版本 0.16.0
  2. 图中的红色边框内容,是我们今天分析的内容:设置运行环境

设置运行环境:

1、main函数入口

比特币核心的main函数入口在 src/bitcoin.cpp 179行。用IDE搜索一下项目中全部文件就可以找到了,均益用的Sublime搜索 main( .
这个函数里有三个方法,分别是SetupEnvironment()、noui_connect()、AppInit(argc, argv)。今天我们就来先分析第一个设置运行环境。

2、SetupEnvironment()

这个函数在 util.cpp文件中定义,在这个函数中,首先是内存分配设置。
此处内存分配区设置的目的是为了防止32位操作系统中虚拟地址空间过渡使用,即程序中的控制内存分配。通过sizeof(void*)==4判断当前系统是否为32位,如果是,则通过mallopt设置只有1个内存分配区,即表示系统按CPU进行自动设置。

if (sizeof(void*) == 4) { // 编译器目标平台有关,x86通常4 bytes. x64通常8bytes.
        mallopt(M_ARENA_MAX, 1);//手动设置每个线程的arena数量:mallopt(M_ARENA_MAX, 1) ,设置为0则为系统自动设置。
    }

然后是本地化设置。
C/C++程序中,locale(即系统区域设置,即国家或地区设置)将决定程序所使用的当前语言编码、日期格式、数字格式及其它与区域有关的设置,locale设置的正确与否将影响到程序中字符串处理(wchar_t如何输出、strftime()的格式等)。因此,对于每一个程序,都应该慎重处理locale设置。

    // On most POSIX systems (e.g. Linux, but not BSD) the environment's locale
    // may be invalid, in which case the "C" locale is used as fallback.
    //在多数POSIX系统中(Linux,不包括BSD)本地环境设置是无效的,在这种情况下,C本地设置用做fallback.
#if !defined(WIN32) && !defined(MAC_OSX) && !defined(__FreeBSD__) && !defined(__OpenBSD__)
    try {
        std::locale(""); // Raises a runtime error if current locale is invalid.如果当前区域设置无效,则引发运行时错误。
    } catch (const std::runtime_error&) {
        setenv("LC_ALL", "C", 1);
    }
#endif

最后是本地化文件路径设置,通过boost::filesystem::path::imbue实现文件系统的本地化设置

    std::locale loc = fs::path::imbue(std::locale::classic());
    fs::path::imbue(loc);

信号处理方法:

noui_connect()这个函数在 noui.cpp 中定义,调用 ui_interface.h 中CClientUIInterface类, 以信号/槽机制处理程序运行过程的消息,包括安全提示和初始化信息。

参考连接
https://zhuanlan.zhihu.com/p/22201268
https://www.jianshu.com/p/4fc762796f83

Leave a Reply

Your email address will not be published. Required fields are marked *