PostgreSQL系统的主要功能都集中于Postgres程序,其入口是Main模块(src/backend/main/main.c)中的main函数,在初始化数据集簇、启动数据库服务器时,都将从这里开始执行。Main模块主要的工作是确定当前的操作系统平台,并据此做一些平台相关的环境变量设置和初始化,然后通过对命令行参数的判断,将控制转到相应的模块中去。PG使用一种专用服务器进程体系结构,其中,最主要的两个进程就是守护进程Postmaster和服务进程Postgres。从本质上来说,Postmaster和Postgres都是通过载入Postgres程序而形成的进程,只是在运行时所处的分支不同而已。
Main模块为postgres的化身(postmaster、standalone backend、standalone bootstrap mode)做必要的启动任务(确定当前的操作系统平台,并据此做一些平台相关的环境变量设置和初始化,然后通过对命令行参数的判断),然后将控制权交给postgres。
int main(int argc, char *argv[]){
progname = get_progname(argv[0]);
/* Platform-specific startup hacks */
startup_hacks(progname);
/* Remember the physical location of the initially given argv[] array for possible use by ps display. */
argv = save_ps_display_args(argc, argv);
/* Set up locale information from environment. */
set_pglocale_pgservice(argv[0],PG_TEXTDOMAIN("postgres"));
#ifdef
pg_perm_setlocale(LC_MESSAGES, "");
#endif
pg_perm_setlocale(LC_MONETARY, "C");
pg_perm_setlocale(LC_NUMERIC, "C");
pg_perm_setlocale(LC_TIME, "C");
/* remove any LC_ALL setting */
unsetenv("LC_ALL");
if (argc > 1){
if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0){
help(progname);
exit(0);
}
if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0){
puts("postgres (PostgreSQL) " PG_VERSION);
exit(0);
}
}
/* Make sure we are not running as root. */
check_root(progname);
/* Dispatch to one of various subprograms depending on first argument. */
#ifdef
if (argc > 1 && strncmp(argv[1], "--fork", 6) == 0)
exit(SubPostmasterMain(argc, argv));
#endif
if (argc > 1 && strcmp(argv[1], "--boot") == 0)
AuxiliaryProcessMain(argc, argv); /* does not return */
if (argc > 1 && strcmp(argv[1], "--describe-config") == 0)
exit(GucInfoMain());
if (argc > 1 && strcmp(argv[1], "--single") == 0)
exit(PostgresMain(argc, argv, get_current_username(progname)));
exit(PostmasterMain(argc, argv));
}
指定EXEC_BACKEND,命令行指定–fork,执行SubPostmasterMain(argc. argv)
命令行指定–boot,执行AuxiliaryProcessMain(argc, argv),后台Postgres进程创建数据库集簇入口
命令行指定–describe-config,执行GucInfoMain()
命令行指定–single,执行PostgresMain(argc, argv, get_current_username(progname)),单用户环境初始化
执行PostmasterMain(argc, argv),服务器守护进程Postmaster