PostgreSQL启动过程中的那些事十二:为postmaster进程设置信号句柄
?
??? 现在离数据库启动过程的高潮只有几步之遥,这几步比较简单,简要描述之。
??? 这几步包括:
?????? 八:设置虚拟文件描述符
?????? 九:初始化活跃backend进程列表
?????? 十:创建opts文件
?????? 十一:保存非默认GUC参数到文件
?????? 十二:为postmaster进程安装信号句柄
?????? 十三:为统计进程启动准备资源
?????? 十四:为autovuc进程启动做条件检查
?????? 十五:加载客户端认证配置文件
再接着调用pqinitmask方法和pqsignal方法,为postmaster进程安装信号句柄
??? pqinitmask();
??? PG_SETMASK(&BlockSig);
???? pqsignal(SIGHUP, SIGHUP_handler);? /* reread config file and have
??????????????????????????????????? * children do same */
??? pqsignal(SIGINT, pmdie); /* send SIGTERM and shut down */
??? pqsignal(SIGQUIT, pmdie);?? /* send SIGQUIT and die */
??? pqsignal(SIGTERM, pmdie);?? /* wait for children and shut down */
??? pqsignal(SIGALRM, SIG_IGN); /* ignored */
??? pqsignal(SIGPIPE, SIG_IGN); /* ignored */
??? pqsignal(SIGUSR1, sigusr1_handler); /* message from child process */
??? pqsignal(SIGUSR2, dummy_handler);? /* unused, reserve for children */
??? pqsignal(SIGCHLD, reaper);? /* handle child termination */
??? pqsignal(SIGTTIN, SIG_IGN); /* ignored */
??? pqsignal(SIGTTOU, SIG_IGN); /* ignored */
??? /* ignore SIGXFSZ, so that ulimit violations work like disk full */
#ifdef SIGXFSZ
??? pqsignal(SIGXFSZ, SIG_IGN); /* ignored */
#endif
其中pqsignal(SIGCHLD, reaper);是如果发生SINGCHLD信号,就reaper方法处理。这个后面数据库启动的时候会体现。
?
初始化信号句柄调用流程图