以Ceph Monitor的守護進程實現(xiàn)為例,源碼文件: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對系統(tǒng)的fork調用封裝了一個類Preforker,實現(xiàn)比較簡單,代碼文件是src/common/Preforker.h
可以看到,父進程并沒有退出币厕,而是直接進入等待。子進程被創(chuàng)建之后芽腾,繼續(xù)下面的邏輯旦装。因此,Ceph的每個monitor實例會存在兩個進程摊滔。其實阴绢,OSD實例也是一樣。