Thread

  1. [PATCH v12a 2/4] Centralize resetting SIGCHLD handler

    Heikki Linnakangas <heikki.linnakangas@iki.fi> — 2026-01-08T18:22:43Z

    ---
     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 74574e1eaf9..e8180634db5 100644
    --- a/src/backend/postmaster/autovacuum.c
    +++ b/src/backend/postmaster/autovacuum.c
    @@ -410,7 +410,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, SIG_DFL);
     
     	/*
     	 * Create a per-backend PGPROC struct in shared memory.  We must do this
    @@ -1417,7 +1416,6 @@ AutoVacWorkerMain(const void *startup_data, size_t startup_data_len)
     	pqsignal(SIGUSR1, procsignal_sigusr1_handler);
     	pqsignal(SIGUSR2, SIG_IGN);
     	pqsignal(SIGFPE, FloatExceptionHandler);
    -	pqsignal(SIGCHLD, 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 0104a86b9ec..8ff6a88a141 100644
    --- a/src/backend/postmaster/bgworker.c
    +++ b/src/backend/postmaster/bgworker.c
    @@ -782,7 +782,6 @@ BackgroundWorkerMain(const void *startup_data, size_t startup_data_len)
     
     	pqsignal(SIGPIPE, SIG_IGN);
     	pqsignal(SIGUSR2, SIG_IGN);
    -	pqsignal(SIGCHLD, 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 1d8947774a9..efd041832a8 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, SIG_IGN);
     
    -	/*
    -	 * Reset some signals that are accepted by postmaster but not here
    -	 */
    -	pqsignal(SIGCHLD, 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 e4075265495..98c2933a822 100644
    --- a/src/backend/postmaster/checkpointer.c
    +++ b/src/backend/postmaster/checkpointer.c
    @@ -222,11 +222,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, 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 fa4bdfe9ab9..36247c8a254 100644
    --- a/src/backend/postmaster/pgarch.c
    +++ b/src/backend/postmaster/pgarch.c
    @@ -238,9 +238,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, 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 cdbe53dd262..330c10ddb0b 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, SIG_DFL);
    -
     	/*
     	 * Register timeouts needed for standby mode
     	 */
    diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c
    index 9792f638718..74d082ea51c 100644
    --- a/src/backend/postmaster/syslogger.c
    +++ b/src/backend/postmaster/syslogger.c
    @@ -284,11 +284,6 @@ SysLoggerMain(const void *startup_data, size_t startup_data_len)
     	pqsignal(SIGUSR1, sigUsr1Handler);	/* request log rotation */
     	pqsignal(SIGUSR2, SIG_IGN);
     
    -	/*
    -	 * Reset some signals that are accepted by postmaster but not here
    -	 */
    -	pqsignal(SIGCHLD, SIG_DFL);
    -
     	sigprocmask(SIG_SETMASK, &UnBlockSig, NULL);
     
     #ifdef WIN32
    diff --git a/src/backend/postmaster/walsummarizer.c b/src/backend/postmaster/walsummarizer.c
    index e1aa102f41d..09a8301d669 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, 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 2c3b4f831aa..f2ba5720986 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, SIG_IGN); /* not used */
     
    -	/*
    -	 * Reset some signals that are accepted by postmaster but not here
    -	 */
    -	pqsignal(SIGCHLD, 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 e75db69e3f6..91c17928e9c 100644
    --- a/src/backend/replication/logical/slotsync.c
    +++ b/src/backend/replication/logical/slotsync.c
    @@ -1541,7 +1541,6 @@ ReplSlotSyncWorkerMain(const void *startup_data, size_t startup_data_len)
     	pqsignal(SIGUSR1, procsignal_sigusr1_handler);
     	pqsignal(SIGUSR2, SIG_IGN);
     	pqsignal(SIGPIPE, SIG_IGN);
    -	pqsignal(SIGCHLD, SIG_DFL);
     
     	check_and_set_sync_info(MyProcPid);
     
    diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c
    index fabe3c73034..06d0fc1c23d 100644
    --- a/src/backend/replication/walreceiver.c
    +++ b/src/backend/replication/walreceiver.c
    @@ -258,9 +258,6 @@ WalReceiverMain(const void *startup_data, size_t startup_data_len)
     	pqsignal(SIGUSR1, procsignal_sigusr1_handler);
     	pqsignal(SIGUSR2, SIG_IGN);
     
    -	/* Reset some signals that are accepted by postmaster but not here */
    -	pqsignal(SIGCHLD, 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 79fc192b171..f0912f3f670 100644
    --- a/src/backend/replication/walsender.c
    +++ b/src/backend/replication/walsender.c
    @@ -3744,9 +3744,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, SIG_DFL);
     }
     
     /* Report shared-memory space needed by WalSndShmemInit */
    diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
    index d01a09dd0c4..5d66c80567c 100644
    --- a/src/backend/tcop/postgres.c
    +++ b/src/backend/tcop/postgres.c
    @@ -4285,13 +4285,6 @@ PostgresMain(const char *dbname, const char *username)
     		pqsignal(SIGUSR1, procsignal_sigusr1_handler);
     		pqsignal(SIGUSR2, SIG_IGN);
     		pqsignal(SIGFPE, FloatExceptionHandler);
    -
    -		/*
    -		 * Reset some signals that are accepted by postmaster but not by
    -		 * backend
    -		 */
    -		pqsignal(SIGCHLD, 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 ba191977697..8d898790c3e 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, 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.53.0.1.gb2826b52eb
    
    
    --3rzmtywijtp4k7v2
    Content-Type: text/x-diff; charset=us-ascii
    Content-Disposition: attachment;
    	filename="v12a-0003-Replace-Latches-with-Interrupts.patch"