以Ceph Monitor的守护进程实现为例,源码文件:src/ceph_mon.cc
Preforker prefork;
if (!(flags & CINIT_FLAG_NO_DAEMON_ACTIONS)) {
if (global_init_prefork(g_ceph_context) >= 0) {
string err_msg;
err = prefork.prefork(err_msg);
if (err < 0) {
cerr << err_msg << std::endl;
prefork.exit(err);
}
if (prefork.is_parent()) {
err = prefork.parent_wait(err_msg);
if (err < 0)
cerr << err_msg << std::endl;
prefork.exit(err);
}
global_init_postfork_start(g_ceph_context);
}
common_init_finish(g_ceph_context);
global_init_chdir(g_ceph_context);
if (global_init_preload_erasure_code(g_ceph_context) < 0)
prefork.exit(1);
}
Ceph对系统的fork调用封装了一个类Preforker,实现比较简单,代码文件是src/common/Preforker.h
可以看到,父进程并没有退出,而是直接进入等待。子进程被创建之后,继续下面的逻辑。因此,Ceph的每个monitor实例会存在两个进程。其实,OSD实例也是一样。