mongo后台进程的入口:mongo/src/mongo/db/dbmain.cpp,wmain(for windows)和main函数,main函数也很简单,就是委托给db.cpp中的mongoDbMain函数来处理。

下面的这段代码就是db.cpp:mongoDbMain的执行过程:

int mongoDbMain(int argc, char* argv[], char** envp) {
// 注册进程关闭时候执行的任务
registerShutdownTask(shutdownTask);
// 设置信号处理器, 比如kill -9 [mongo的pid]
setupSignalHandlers();
// srand函数是随机数发生器的初始化函数。原型:void srand(unsigned int seed);srand和rand()配合使用产生伪随机数序列。
srand(static_cast<unsigned>(curTimeMicros64()));
// 执行全局初始化
Status status = mongo::runGlobalInitializers(argc, argv, envp);
// 判断初始化执行是否成功
if (!status.isOK()) {
// 初始化执行失败了, 打日志, 程序退出
severe(LogComponent::kControl) << "Failed global initialization: " << status;
quickExit(EXIT_FAILURE);
} try {
// 设置全局的服务上下文, 上下文这个东西真的是脑壳疼, 姑且当作一个存放变量的容器吧
setGlobalServiceContext(ServiceContext::make());
} catch (...) {
auto cause = exceptionToStatus();
severe(LogComponent::kControl) << "Failed to create service context: " << redact(cause);
quickExit(EXIT_FAILURE);
} // 获取全局服务的上下文
auto service = getGlobalServiceContext();
// 设置Replication, replication是复制的意思
setUpReplication(service);
// 设置服务的入口点, 客户端对服务器的访问走的是入口点
service->setServiceEntryPoint(std::make_unique<ServiceEntryPointMongod>(service)); // 这个不知道是什么意思
ErrorExtraInfo::invariantHaveAllParsers();
// 启动时的配置动作, argv就是我们启动mongo时候的配置参数
startupConfigActions(std::vector<std::string>(argv, argv + argc));
cmdline_utils::censorArgvArray(argc, argv); // 初始化服务的全局状态
if (!initializeServerGlobalState(service))
quickExit(EXIT_FAILURE); // Per SERVER-7434, startSignalProcessingThread must run after any forks (i.e.
// initializeServerGlobalState) and before the creation of any other threads
// 启动信号处理进行, 上面的官方注释说的是这个函数的执行有先后顺序
startSignalProcessingThread(); #if defined(_WIN32)
if (ntservice::shouldStartService()) {
ntservice::startService();
// exits directly and so never reaches here either.
}
#endif // 执行启动的测试, 我猜的是检查启动是否有啥异常
StartupTest::runTests();
// 初始化以及监听, 前面都是一些准备动作, 这里是真的要开始监听了, 监听成功就可以接受请求, 然后处理各种CRUD, 执行各种命令了
ExitCode exitCode = initAndListen(serverGlobalParams.port);
exitCleanly(exitCode);
return ;
}

上面的代码读起来还是没有啥太大难度,就是做了一些启动的初始化以及准备工作,然后打开监听开始接收请求。现在我还没有管每个里面是怎么具体执行,接下来我比较感兴趣的是,从客户端的请求是怎么来到入口点的。

最新文章

  1. Android N开发 你需要知道的一切
  2. JavaScript易错知识点整理
  3. JDBC、DAO
  4. 转载:移动web开发规范
  5. Android Paint和Color类绘画实例
  6. unity3d 音频无缝循环
  7. 【poj1112】 Team Them Up!
  8. hdu 4585 set应用
  9. 采集/自动登录啊都可以用这两个方法实现 asp.net
  10. 高性能图文混排框架,构架顺滑的iOS应用-b
  11. 李洪强iOS开发之XMPP
  12. Java抽奖小程序
  13. [React] Using the classnames library for conditional CSS
  14. poj 3273 Monthly Expense(二分搜索之最大化最小值)
  15. Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )
  16. 【一天一道LeetCode】#344. Reverse String
  17. 混合编程[python+cpp+cuda]
  18. 蓝桥杯_算法训练_ALGO10_集合运算
  19. python中的pymongo连接脚本
  20. 拒绝了对对象 &#39;Proc_LHDashBoard&#39; (数据库 &#39;jy&#39;,架构 &#39;dbo&#39;)的 EXECUTE 权限。”

热门文章

  1. 使用JDBC改变Oracle的session參数 NLS_DATE_FORMAT
  2. cocos2d-x 3.0正式版 cmd创建project以及一键创建project
  3. C++编程技巧降低编译时间
  4. SharePoint 中时间轴 Timeline的实现
  5. grafana 的面板设置
  6. 呃,如何使 .NET 程序,在 64位 系统 中,以 32位 模式运行。
  7. Spring MVC+Hibernate JPA搭建的博客系统项目中所遇到的坑
  8. js函数调用二种常用方法的例子
  9. Vue2 原理解析
  10. Android xUtils3源代码解析之网络模块