main->PostmasterMain->ServerLoop:
for(;;){
...
//会阻塞在这,监视文件描述符的变化
selres = select(nSockets, &rmask, NULL, NULL, &timeout);
if (selres > 0){
for (i = 0; i < MAXLISTEN; i++){
//找一个有效的fd
if (ListenSocket[i] == PGINVALID_SOCKET)
break;
if (FD_ISSET(ListenSocket[i], &rmask)){
port = ConnCreate(ListenSocket[i]);->StreamConnection->accept
BackendStartup(port);//fork进程
|-- pid = fork_process();
| if (pid == 0){//child
| InitPostmasterChild();
| ClosePostmasterPorts(false);
| BackendInitialize(port);
| //该函数不会返回
| BackendRun(port);->PostgresMain:
| |-- for (;;){
| | if (send_ready_for_query){
| | ...
| | ReadyForQuer
PostgreSQL server端接收连接后fork进程
最新推荐文章于 2022-02-20 12:27:20 发布