水莹儿 发表于 2018-10-19 09:39:00

PostgreSQL server端接收连接后fork进程

main->PostmasterMain->ServerLoop:  for(;;){
  ...
  //会阻塞在这,监视文件描述符的变化
  selres = select(nSockets, &rmask, NULL, NULL, &timeout);
  if (selres > 0){
  for (i = 0; i < MAXLISTEN; i++){
  //找一个有效的fd
  if (ListenSocket == PGINVALID_SOCKET)
  break;
  if (FD_ISSET(ListenSocket, &rmask)){
  port = ConnCreate(ListenSocket);->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){
  ||...
  ||ReadyForQuery(whereToSendOutput);->pq_flush();->internal_flush->secure_write->secure_raw_write->send
  ||send_ready_for_query = false;
  ||}
  ||firstchar = ReadCommand(&input_message);
  ||switch(firstchar):{
  ||case 'Q':exec_simple_query(query_string);
  ||...
  ||}
  ||--}
  |}
  |...father
  |--return STATUS_OK
  //关闭father socket
  StreamClose(port->sock);
  ConnFree(port);
  }
  }
  }
  }


页: [1]
查看完整版本: PostgreSQL server端接收连接后fork进程