gdb 调试命令
gdb postgres
b ServerLoop
run -D "/home/citest/ci_test/data/master/gpseg-1" -p 5432 -E
b reaper
set follow-fork-mode child
c
调用的顺序是
main.c -> PostmasterMain -> ServerLoop -> pthread_sigmask -> StartChildProcess
PostmasterMain 中
- pqsignal(SIGCHLD, reaper); 注册信号
- load_auxiliary_libraries 注册启动函数
ServerLoop 中
- PG_SETMASK 分出子进程处理 SIGCHLD 信号,处理函数是 reaper,在第一次调用时会调用 StartChildProcess 启动各种背景进程
当有子进程挂了,postmaster 会收到 sigchld 信号,调用 reaper 中的 HandleChildCrash,清理所有子进程
再重新拉起所有子进程
附:
postmasterMain 进程: