From 3c07fbf40bd0276e4be02fc72cba6b1cd62da301 Mon Sep 17 00:00:00 2001 From: Tom Lane <tgl@sss.pgh.pa.us> Date: Sun, 17 Mar 2013 16:09:47 -0400 Subject: [PATCH] Use pqsignal() in contrib programs rather than calling signal(2) directly. 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 | 8 ++++---- contrib/pg_test_fsync/pg_test_fsync.c | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/contrib/pg_standby/pg_standby.c b/contrib/pg_standby/pg_standby.c index 659bd50da7d..11615eb438b 100644 --- a/contrib/pg_standby/pg_standby.c +++ b/contrib/pg_standby/pg_standby.c @@ -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) diff --git a/contrib/pg_test_fsync/pg_test_fsync.c b/contrib/pg_test_fsync/pg_test_fsync.c index 5ee03981a3b..7bc0d0e5fd9 100644 --- a/contrib/pg_test_fsync/pg_test_fsync.c +++ b/contrib/pg_test_fsync/pg_test_fsync.c @@ -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(); -- GitLab