PG主程序模块(Main)——数据库PostgreSQL入口
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。
1 int main(int argc, char *argv[]){ 2 progname = get_progname(argv[0]); 3 /* Platform-specific startup hacks */ 4 startup_hacks(progname); 5 /* Remember the physical location of the initially given argv[] array for possible use by ps display. */ 6 argv = save_ps_display_args(argc, argv); 7 /* Set up locale information from environment. */ 8 set_pglocale_pgservice(argv[0],PG_TEXTDOMAIN("postgres")); 9 #ifdef LC_MESSAGES 10 pg_perm_setlocale(LC_MESSAGES, ""); 11 #endif 12 pg_perm_setlocale(LC_MONETARY, "C"); 13 pg_perm_setlocale(LC_NUMERIC, "C"); 14 pg_perm_setlocale(LC_TIME, "C"); 15 /* remove any LC_ALL setting */ 16 unsetenv("LC_ALL"); 17 if (argc > 1){ 18 if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0){ 19 help(progname); 20 exit(0); 21 } 22 if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0){ 23 puts("postgres (PostgreSQL) " PG_VERSION); 24 exit(0); 25 } 26 } 27 /* Make sure we are not running as root. */ 28 check_root(progname); 29 /* Dispatch to one of various subprograms depending on first argument. */ 30 #ifdef EXEC_BACKEND 31 if (argc > 1 && strncmp(argv[1], "--fork", 6) == 0) 32 exit(SubPostmasterMain(argc, argv)); 33 #endif 34 if (argc > 1 && strcmp(argv[1], "--boot") == 0) 35 AuxiliaryProcessMain(argc, argv); /* does not return */ 36 if (argc > 1 && strcmp(argv[1], "--describe-config") == 0) 37 exit(GucInfoMain()); 38 if (argc > 1 && strcmp(argv[1], "--single") == 0) 39 exit(PostgresMain(argc, argv, get_current_username(progname))); 40 exit(PostmasterMain(argc, argv)); 41 }
指定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