Use pqsignal() in contrib programs rather than calling signal(2) directly.
authorTom Lane
Sun, 17 Mar 2013 20:09:47 +0000 (16:09 -0400)
committerTom Lane
Sun, 17 Mar 2013 20:09:47 +0000 (16:09 -0400)
The semantics of signal(2) are more variable than one could wish; in
particular, on strict-POSIX platforms the signal handler will be reset
to SIG_DFL when the signal is delivered.  This demonstrably breaks
pg_test_fsync's use of SIGALRM.  The other changes I made are not
absolutely necessary today, because the called handlers all exit the
program anyway.  But it seems like a good general practice to use
pqsignal() exclusively in Postgres code, now that we have it available
everywhere.

contrib/pg_standby/pg_standby.c
contrib/pg_test_fsync/pg_test_fsync.c

index 659bd50da7d93f4730af7789fc02e9404a15c92c..11615eb438b81bcccaac16ce8e93106e99c8ffdb 100644 (file)
@@ -549,7 +549,7 @@ sighandler(int sig)
 static void
 sigquit_handler(int sig)
 {
-   signal(SIGINT, SIG_DFL);
+   pqsignal(SIGINT, SIG_DFL);
    kill(getpid(), SIGINT);
 }
 #endif
@@ -592,9 +592,9 @@ main(int argc, char **argv)
     *
     * There's no way to trigger failover via signal on Windows.
     */
-   (void) signal(SIGUSR1, sighandler);
-   (void) signal(SIGINT, sighandler);  /* deprecated, use SIGUSR1 */
-   (void) signal(SIGQUIT, sigquit_handler);
+   (void) pqsignal(SIGUSR1, sighandler);
+   (void) pqsignal(SIGINT, sighandler);    /* deprecated, use SIGUSR1 */
+   (void) pqsignal(SIGQUIT, sigquit_handler);
 #endif
 
    while ((c = getopt(argc, argv, "cdk:lr:s:t:w:")) != -1)
index 5ee03981a3bf5281ebc3c1b010bc45edd3136ad0..7bc0d0e5fd9cdefb39a695bf93f55e56ceba73ad 100644 (file)
@@ -101,14 +101,14 @@ main(int argc, char *argv[])
    handle_args(argc, argv);
 
    /* Prevent leaving behind the test file */
-   signal(SIGINT, signal_cleanup);
-   signal(SIGTERM, signal_cleanup);
+   pqsignal(SIGINT, signal_cleanup);
+   pqsignal(SIGTERM, signal_cleanup);
 #ifndef WIN32
-   signal(SIGALRM, process_alarm);
+   pqsignal(SIGALRM, process_alarm);
 #endif
 #ifdef SIGHUP
    /* Not defined on win32 */
-   signal(SIGHUP, signal_cleanup);
+   pqsignal(SIGHUP, signal_cleanup);
 #endif
 
    prepare_buf();