Leave SIGTTIN/SIGTTOU signal handling alone in postmaster child processes.
authorTom Lane <tgl@sss.pgh.pa.us>
Sat, 17 Nov 2018 21:23:55 +0000 (16:23 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Sat, 17 Nov 2018 21:31:16 +0000 (16:31 -0500)
For reasons lost in the mists of time, most postmaster child processes
reset SIGTTIN/SIGTTOU signal handling to SIG_DFL, with the major exception
that backend sessions do not.  It seems like a pretty bad idea for any
postmaster children to do that: if stderr is connected to the terminal,
and the user has put the postmaster in background, any log output would
result in the child process freezing up.  Hence, switch them all to
doing what backends do, ie, nothing.  This allows them to inherit the
postmaster's SIG_IGN setting.  On the other hand, manually-launched
processes such as standalone backends will have default processing,
which seems fine.

In passing, also remove useless resets of SIGCONT and SIGWINCH signal
processing.  Perhaps the postmaster once changed those to something
besides SIG_DFL, but it doesn't now, so these are just wasted (and
confusing) syscalls.

Basically, this propagates the changes made in commit 8e2998d8a from
backends to other postmaster children.  Probably the only reason these
calls now exist elsewhere is that I missed changing pgstat.c along with
postgres.c at the time.

Given the lack of field complaints that can be traced to this, I don't
presently feel a need to back-patch.

Discussion: https://postgr.es/m/5627.1542477392@sss.pgh.pa.us

src/backend/postmaster/bgwriter.c
src/backend/postmaster/checkpointer.c
src/backend/postmaster/pgarch.c
src/backend/postmaster/pgstat.c
src/backend/postmaster/postmaster.c
src/backend/postmaster/startup.c
src/backend/postmaster/syslogger.c
src/backend/postmaster/walwriter.c
src/backend/replication/walreceiver.c
src/backend/replication/walsender.c

index b1e9bb2c537b86d6c5c2837d095889e9acab69c9..54a042843daaa453cf7379bff19cc494a8b46b5d 100644 (file)
@@ -133,10 +133,6 @@ BackgroundWriterMain(void)
         * Reset some signals that are accepted by postmaster but not here
         */
        pqsignal(SIGCHLD, SIG_DFL);
-       pqsignal(SIGTTIN, SIG_DFL);
-       pqsignal(SIGTTOU, SIG_DFL);
-       pqsignal(SIGCONT, SIG_DFL);
-       pqsignal(SIGWINCH, SIG_DFL);
 
        /* We allow SIGQUIT (quickdie) at all times */
        sigdelset(&BlockSig, SIGQUIT);
index 1a033093c5384a3469ae0d7ec0dfa25a1b52d172..9eac86b554b8577452686c3091f1e8a5c30039d9 100644 (file)
@@ -218,10 +218,6 @@ CheckpointerMain(void)
         * Reset some signals that are accepted by postmaster but not here
         */
        pqsignal(SIGCHLD, SIG_DFL);
-       pqsignal(SIGTTIN, SIG_DFL);
-       pqsignal(SIGTTOU, SIG_DFL);
-       pqsignal(SIGCONT, SIG_DFL);
-       pqsignal(SIGWINCH, SIG_DFL);
 
        /* We allow SIGQUIT (quickdie) at all times */
        sigdelset(&BlockSig, SIGQUIT);
index 885e85ad8af43bf6ff669791e4c7e53697991a3d..0ebd63650c64a0c90c57a5c64be978f027d29d84 100644 (file)
@@ -226,11 +226,8 @@ PgArchiverMain(int argc, char *argv[])
        pqsignal(SIGPIPE, SIG_IGN);
        pqsignal(SIGUSR1, pgarch_waken);
        pqsignal(SIGUSR2, pgarch_waken_stop);
+       /* Reset some signals that are accepted by postmaster but not here */
        pqsignal(SIGCHLD, SIG_DFL);
-       pqsignal(SIGTTIN, SIG_DFL);
-       pqsignal(SIGTTOU, SIG_DFL);
-       pqsignal(SIGCONT, SIG_DFL);
-       pqsignal(SIGWINCH, SIG_DFL);
        PG_SETMASK(&UnBlockSig);
 
        /*
index 42bccce0af4b2db4564bc14cb391c7dd8122ab2d..790d7f02af16764e5a178d4ed342a09a4a36ac3f 100644 (file)
@@ -4267,11 +4267,8 @@ PgstatCollectorMain(int argc, char *argv[])
        pqsignal(SIGPIPE, SIG_IGN);
        pqsignal(SIGUSR1, SIG_IGN);
        pqsignal(SIGUSR2, SIG_IGN);
+       /* Reset some signals that are accepted by postmaster but not here */
        pqsignal(SIGCHLD, SIG_DFL);
-       pqsignal(SIGTTIN, SIG_DFL);
-       pqsignal(SIGTTOU, SIG_DFL);
-       pqsignal(SIGCONT, SIG_DFL);
-       pqsignal(SIGWINCH, SIG_DFL);
        PG_SETMASK(&UnBlockSig);
 
        /*
index cb49f3255f9865387df9ef835172925f41b824f1..68bb35ab791fe616d9e00db23787bcfa08d01614 100644 (file)
@@ -646,8 +646,17 @@ PostmasterMain(int argc, char *argv[])
        pqsignal_no_restart(SIGUSR2, dummy_handler);    /* unused, reserve for
                                                                                                         * children */
        pqsignal_no_restart(SIGCHLD, reaper);   /* handle child termination */
+
+       /*
+        * No other place in Postgres should touch SIGTTIN/SIGTTOU handling.  We
+        * ignore those signals in a postmaster environment, so that there is no
+        * risk of a child process freezing up due to writing to stderr.  But for
+        * a standalone backend, their default handling is reasonable.  Hence, all
+        * child processes should just allow the inherited settings to stand.
+        */
        pqsignal(SIGTTIN, SIG_IGN); /* ignored */
        pqsignal(SIGTTOU, SIG_IGN); /* ignored */
+
        /* ignore SIGXFSZ, so that ulimit violations work like disk full */
 #ifdef SIGXFSZ
        pqsignal(SIGXFSZ, SIG_IGN); /* ignored */
index 2926211e35da7a4f47da084837377fe83b411c74..983a05d7db5b1493323e5a537563f266668635d9 100644 (file)
@@ -188,10 +188,6 @@ StartupProcessMain(void)
         * Reset some signals that are accepted by postmaster but not here
         */
        pqsignal(SIGCHLD, SIG_DFL);
-       pqsignal(SIGTTIN, SIG_DFL);
-       pqsignal(SIGTTOU, SIG_DFL);
-       pqsignal(SIGCONT, SIG_DFL);
-       pqsignal(SIGWINCH, SIG_DFL);
 
        /*
         * Register timeouts needed for standby mode
index 29bdcec8958496894d59c1ea0567fe66f1e124f9..35755138890c9a41c4d3ed35401babf070e0fd2b 100644 (file)
@@ -257,10 +257,6 @@ SysLoggerMain(int argc, char *argv[])
         * Reset some signals that are accepted by postmaster but not here
         */
        pqsignal(SIGCHLD, SIG_DFL);
-       pqsignal(SIGTTIN, SIG_DFL);
-       pqsignal(SIGTTOU, SIG_DFL);
-       pqsignal(SIGCONT, SIG_DFL);
-       pqsignal(SIGWINCH, SIG_DFL);
 
        PG_SETMASK(&UnBlockSig);
 
index fb66bceeedf555b8a6933d63ce8db5712ff9d591..3e09827854d36564b7ae1d7db99de410fcb65eec 100644 (file)
@@ -121,10 +121,6 @@ WalWriterMain(void)
         * Reset some signals that are accepted by postmaster but not here
         */
        pqsignal(SIGCHLD, SIG_DFL);
-       pqsignal(SIGTTIN, SIG_DFL);
-       pqsignal(SIGTTOU, SIG_DFL);
-       pqsignal(SIGCONT, SIG_DFL);
-       pqsignal(SIGWINCH, SIG_DFL);
 
        /* We allow SIGQUIT (quickdie) at all times */
        sigdelset(&BlockSig, SIGQUIT);
index 6f4b3538ac4b0f6d01a9b91f6608be9812c739c7..cb7bb47c9bdf9db65d2c5e5fca4915020230f60e 100644 (file)
@@ -279,10 +279,6 @@ WalReceiverMain(void)
 
        /* Reset some signals that are accepted by postmaster but not here */
        pqsignal(SIGCHLD, SIG_DFL);
-       pqsignal(SIGTTIN, SIG_DFL);
-       pqsignal(SIGTTOU, SIG_DFL);
-       pqsignal(SIGCONT, SIG_DFL);
-       pqsignal(SIGWINCH, SIG_DFL);
 
        /* We allow SIGQUIT (quickdie) at all times */
        sigdelset(&BlockSig, SIGQUIT);
index 39337d2f1f8d8836f83675106af4ab628653ae3b..3f24f9b4e05a3965df9125fb9c1f3dc1bf21e539 100644 (file)
@@ -3003,10 +3003,6 @@ WalSndSignals(void)
 
        /* Reset some signals that are accepted by postmaster but not here */
        pqsignal(SIGCHLD, SIG_DFL);
-       pqsignal(SIGTTIN, SIG_DFL);
-       pqsignal(SIGTTOU, SIG_DFL);
-       pqsignal(SIGCONT, SIG_DFL);
-       pqsignal(SIGWINCH, SIG_DFL);
 }
 
 /* Report shared-memory space needed by WalSndShmemInit */