开始
在postmaster.c 中的 BackendStartup 中,有如下的代码:
其中定义了 IsUnderPostmaster=true。
而bgwriter 作为 postmaster 的子进程,它的 IsUnderPostmaster 也是为真。
* BackendStartup -- start backend process** returns: STATUS_ERROR if the fork failed, STATUS_OK otherwise.** Note: if you change this code, also consider StartAutovacuumWorker.*/ static int BackendStartup(Port *port) {Backend *bn; /* for backend cleanup */pid_t pid;/** Create backend data structure. Better before the fork() so we can* handle failure cleanly.*/bn = (Backend *) malloc(sizeof(Backend));if (!bn){ereport(LOG,(errcode(ERRCODE_OUT_OF_MEMORY),errmsg("out of memory")));return STATUS_ERROR;}/** Compute the cancel key that will be assigned to this backend. The* backend will have its own copy in the forked-off process' value of* MyCancelKey, so that it can transmit the key to the frontend.*/MyCancelKey = PostmasterRandom();bn->cancel_key = MyCancelKey;/* Pass down canAcceptConnections state */port->canAcceptConnections = canAcceptConnections();bn->dead_end = (port->canAcceptConnections != CAC_OK &&port->canAcceptConnections != CAC_WAITBACKUP);/** Unless it's a dead_end child, assign it a child slot number*/if (!bn->dead_end)bn->child_slot = MyPMChildSlot = AssignPostmasterChildSlot();elsebn->child_slot = 0;#ifdef EXEC_BACKENDpid = backend_forkexec(port); #else /* !EXEC_BACKEND */pid = fork_process();if (pid == 0) /* child */{free(bn);/** Let's clean up ourselves as the postmaster child, and close the* postmaster's listen sockets. (In EXEC_BACKEND case this is all* done in SubPostmasterMain.)*/IsUnderPostmaster = true; /* we are a postmaster subprocess now */MyProcPid = getpid(); /* reset MyProcPid */MyStartTime = time(NULL);/* We don't want the postmaster's proc_exit() handlers */on_exit_reset();/* Close the postmaster's sockets */ClosePostmasterPorts(false);/* Perform additional initialization and collect startup packet */BackendInitialize(port);/* And run the backend */proc_exit(BackendRun(port));} #endif /* EXEC_BACKEND */if (pid < 0){/* in parent, fork failed */int save_errno = errno;if (!bn->dead_end)(void) ReleasePostmasterChildSlot(bn->child_slot);free(bn);errno = save_errno;ereport(LOG,(errmsg("could not fork new process for connection: %m")));report_fork_failure_to_client(port, save_errno);return STATUS_ERROR;}/* in parent, successful fork */ereport(DEBUG2,(errmsg_internal("forked new backend, pid=%d socket=%d",(int) pid, (int) port->sock)));/** Everything's been successful, it's safe to add this backend to our list* of backends.*/bn->pid = pid;bn->is_autovacuum = false;DLInitElem(&bn->elem, bn);DLAddHead(BackendList, &bn->elem); #ifdef EXEC_BACKENDif (!bn->dead_end)ShmemBackendArrayAdd(bn); #endifreturn STATUS_OK; }
结束