From 72bbc1428c4da0dbfdbbe9a506917e687acbc448 Mon Sep 17 00:00:00 2001 From: Heikki Linnakangas Date: Tue, 16 Jun 2026 22:06:39 +0300 Subject: [PATCH v13 2/9] Centralize resetting SIGCHLD handler --- src/backend/postmaster/autovacuum.c | 2 -- src/backend/postmaster/bgworker.c | 1 - src/backend/postmaster/bgwriter.c | 5 ----- src/backend/postmaster/checkpointer.c | 5 ----- src/backend/postmaster/pgarch.c | 3 --- src/backend/postmaster/startup.c | 5 ----- src/backend/postmaster/syslogger.c | 5 ----- src/backend/postmaster/walsummarizer.c | 5 ----- src/backend/postmaster/walwriter.c | 5 ----- src/backend/replication/logical/slotsync.c | 1 - src/backend/replication/walreceiver.c | 3 --- src/backend/replication/walsender.c | 3 --- src/backend/tcop/postgres.c | 7 ------- src/backend/utils/init/miscinit.c | 14 ++++++++++++++ 14 files changed, 14 insertions(+), 50 deletions(-) diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 777acaa7c84..31cad5df015 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -447,7 +447,6 @@ AutoVacLauncherMain(const void *startup_data, size_t startup_data_len) pqsignal(SIGUSR1, procsignal_sigusr1_handler); pqsignal(SIGUSR2, avl_sigusr2_handler); pqsignal(SIGFPE, FloatExceptionHandler); - pqsignal(SIGCHLD, PG_SIG_DFL); /* * Create a per-backend PGPROC struct in shared memory. We must do this @@ -1454,7 +1453,6 @@ AutoVacWorkerMain(const void *startup_data, size_t startup_data_len) pqsignal(SIGUSR1, procsignal_sigusr1_handler); pqsignal(SIGUSR2, PG_SIG_IGN); pqsignal(SIGFPE, FloatExceptionHandler); - pqsignal(SIGCHLD, PG_SIG_DFL); /* * Create a per-backend PGPROC struct in shared memory. We must do this diff --git a/src/backend/postmaster/bgworker.c b/src/backend/postmaster/bgworker.c index 2e4acad4f00..2f51814c93d 100644 --- a/src/backend/postmaster/bgworker.c +++ b/src/backend/postmaster/bgworker.c @@ -797,7 +797,6 @@ BackgroundWorkerMain(const void *startup_data, size_t startup_data_len) pqsignal(SIGPIPE, PG_SIG_IGN); pqsignal(SIGUSR2, PG_SIG_IGN); - pqsignal(SIGCHLD, PG_SIG_DFL); /* * If an exception is encountered, processing resumes here. diff --git a/src/backend/postmaster/bgwriter.c b/src/backend/postmaster/bgwriter.c index d364382303a..d6121f2b4fe 100644 --- a/src/backend/postmaster/bgwriter.c +++ b/src/backend/postmaster/bgwriter.c @@ -109,11 +109,6 @@ BackgroundWriterMain(const void *startup_data, size_t startup_data_len) pqsignal(SIGUSR1, procsignal_sigusr1_handler); pqsignal(SIGUSR2, PG_SIG_IGN); - /* - * Reset some signals that are accepted by postmaster but not here - */ - pqsignal(SIGCHLD, PG_SIG_DFL); - /* * We just started, assume there has been either a shutdown or * end-of-recovery snapshot. diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c index a09d4097d51..4b051eb3128 100644 --- a/src/backend/postmaster/checkpointer.c +++ b/src/backend/postmaster/checkpointer.c @@ -231,11 +231,6 @@ CheckpointerMain(const void *startup_data, size_t startup_data_len) pqsignal(SIGUSR1, procsignal_sigusr1_handler); pqsignal(SIGUSR2, SignalHandlerForShutdownRequest); - /* - * Reset some signals that are accepted by postmaster but not here - */ - pqsignal(SIGCHLD, PG_SIG_DFL); - /* * Initialize so that first time-driven event happens at the correct time. */ diff --git a/src/backend/postmaster/pgarch.c b/src/backend/postmaster/pgarch.c index 0f207ac0356..a3fd4f83201 100644 --- a/src/backend/postmaster/pgarch.c +++ b/src/backend/postmaster/pgarch.c @@ -237,9 +237,6 @@ PgArchiverMain(const void *startup_data, size_t startup_data_len) pqsignal(SIGUSR1, procsignal_sigusr1_handler); pqsignal(SIGUSR2, pgarch_waken_stop); - /* Reset some signals that are accepted by postmaster but not here */ - pqsignal(SIGCHLD, PG_SIG_DFL); - /* Unblock signals (they were blocked when the postmaster forked us) */ sigprocmask(SIG_SETMASK, &UnBlockSig, NULL); diff --git a/src/backend/postmaster/startup.c b/src/backend/postmaster/startup.c index d91b7caac01..63624e8caa1 100644 --- a/src/backend/postmaster/startup.c +++ b/src/backend/postmaster/startup.c @@ -234,11 +234,6 @@ StartupProcessMain(const void *startup_data, size_t startup_data_len) pqsignal(SIGUSR1, procsignal_sigusr1_handler); pqsignal(SIGUSR2, StartupProcTriggerHandler); - /* - * Reset some signals that are accepted by postmaster but not here - */ - pqsignal(SIGCHLD, PG_SIG_DFL); - /* * Register timeouts needed for standby mode */ diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c index 7645c495a81..b399adcce75 100644 --- a/src/backend/postmaster/syslogger.c +++ b/src/backend/postmaster/syslogger.c @@ -303,11 +303,6 @@ SysLoggerMain(const void *startup_data, size_t startup_data_len) pqsignal(SIGUSR1, sigUsr1Handler); /* request log rotation */ pqsignal(SIGUSR2, PG_SIG_IGN); - /* - * Reset some signals that are accepted by postmaster but not here - */ - pqsignal(SIGCHLD, PG_SIG_DFL); - sigprocmask(SIG_SETMASK, &UnBlockSig, NULL); #ifdef WIN32 diff --git a/src/backend/postmaster/walsummarizer.c b/src/backend/postmaster/walsummarizer.c index 4f12eaf2c85..89301815dc3 100644 --- a/src/backend/postmaster/walsummarizer.c +++ b/src/backend/postmaster/walsummarizer.c @@ -264,11 +264,6 @@ WalSummarizerMain(const void *startup_data, size_t startup_data_len) ALLOCSET_DEFAULT_SIZES); MemoryContextSwitchTo(context); - /* - * Reset some signals that are accepted by postmaster but not here - */ - pqsignal(SIGCHLD, PG_SIG_DFL); - /* * If an exception is encountered, processing resumes here. */ diff --git a/src/backend/postmaster/walwriter.c b/src/backend/postmaster/walwriter.c index 68dd5047c20..3493be8e630 100644 --- a/src/backend/postmaster/walwriter.c +++ b/src/backend/postmaster/walwriter.c @@ -109,11 +109,6 @@ WalWriterMain(const void *startup_data, size_t startup_data_len) pqsignal(SIGUSR1, procsignal_sigusr1_handler); pqsignal(SIGUSR2, PG_SIG_IGN); /* not used */ - /* - * Reset some signals that are accepted by postmaster but not here - */ - pqsignal(SIGCHLD, PG_SIG_DFL); - /* * Create a memory context that we will do all our work in. We do this so * that we can reset the context during error recovery and thereby avoid diff --git a/src/backend/replication/logical/slotsync.c b/src/backend/replication/logical/slotsync.c index 05637344363..7d2999d77fd 100644 --- a/src/backend/replication/logical/slotsync.c +++ b/src/backend/replication/logical/slotsync.c @@ -1632,7 +1632,6 @@ ReplSlotSyncWorkerMain(const void *startup_data, size_t startup_data_len) pqsignal(SIGUSR1, procsignal_sigusr1_handler); pqsignal(SIGUSR2, PG_SIG_IGN); pqsignal(SIGPIPE, PG_SIG_IGN); - pqsignal(SIGCHLD, PG_SIG_DFL); check_and_set_sync_info(MyProcPid); diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c index 05e2f690fa7..4319cb6fd43 100644 --- a/src/backend/replication/walreceiver.c +++ b/src/backend/replication/walreceiver.c @@ -256,9 +256,6 @@ WalReceiverMain(const void *startup_data, size_t startup_data_len) pqsignal(SIGUSR1, procsignal_sigusr1_handler); pqsignal(SIGUSR2, PG_SIG_IGN); - /* Reset some signals that are accepted by postmaster but not here */ - pqsignal(SIGCHLD, PG_SIG_DFL); - /* Load the libpq-specific functions */ load_file("libpqwalreceiver", false); if (WalReceiverFunctions == NULL) diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index c931d9b4fa8..795393b0be0 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -3977,9 +3977,6 @@ WalSndSignals(void) pqsignal(SIGUSR1, procsignal_sigusr1_handler); pqsignal(SIGUSR2, WalSndLastCycleHandler); /* request a last cycle and * shutdown */ - - /* Reset some signals that are accepted by postmaster but not here */ - pqsignal(SIGCHLD, PG_SIG_DFL); } /* Register shared-memory space needed by walsender */ diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index dbef734a93f..1f2fc3cce9b 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -4332,13 +4332,6 @@ PostgresMain(const char *dbname, const char *username) pqsignal(SIGUSR1, procsignal_sigusr1_handler); pqsignal(SIGUSR2, PG_SIG_IGN); pqsignal(SIGFPE, FloatExceptionHandler); - - /* - * Reset some signals that are accepted by postmaster but not by - * backend - */ - pqsignal(SIGCHLD, PG_SIG_DFL); /* system() requires this on some - * platforms */ } /* Early initialization */ diff --git a/src/backend/utils/init/miscinit.c b/src/backend/utils/init/miscinit.c index 7ffc808073a..5343d4219ae 100644 --- a/src/backend/utils/init/miscinit.c +++ b/src/backend/utils/init/miscinit.c @@ -143,6 +143,15 @@ InitPostmasterChild(void) elog(FATAL, "setsid() failed: %m"); #endif + /* + * Reset signals that are used by postmaster but not by child processes. + * + * Currently just SIGCHLD. The handlers for other signals are overridden + * later, depending on the child process type. + */ + pqsignal(SIGCHLD, PG_SIG_DFL); /* system() requires this to be SIG_DFL + * rather than SIG_IGN on some platforms */ + /* * Every postmaster child process is expected to respond promptly to * SIGQUIT at all times. Therefore we centrally remove SIGQUIT from @@ -155,6 +164,11 @@ InitPostmasterChild(void) sigdelset(&BlockSig, SIGQUIT); sigprocmask(SIG_SETMASK, &BlockSig, NULL); + /* + * It is up to the *Main() function to set signal handlers appropriate for + * the child process and unblock the rest of the signals. + */ + /* Request a signal if the postmaster dies, if possible. */ PostmasterDeathSignalInit(); -- 2.47.3