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

 

posted @ 2020-12-28 22:32  肥叔菌  阅读(901)  评论(0编辑  收藏  举报