aboutsummaryrefslogtreecommitdiff
path: root/src/port/pqsignal.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/port/pqsignal.c')
-rw-r--r--src/port/pqsignal.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/src/port/pqsignal.c b/src/port/pqsignal.c
index e5a73f22748..07797f909aa 100644
--- a/src/port/pqsignal.c
+++ b/src/port/pqsignal.c
@@ -32,7 +32,7 @@
#if !defined(WIN32) || defined(FRONTEND)
/*
- * Set up a signal handler for signal "signo"
+ * Set up a signal handler, with SA_RESTART, for signal "signo"
*
* Returns the previous handler.
*/
@@ -58,4 +58,33 @@ pqsignal(int signo, pqsigfunc func)
#endif
}
+/*
+ * Set up a signal handler, without SA_RESTART, for signal "signo"
+ *
+ * Returns the previous handler.
+ *
+ * On Windows, this would be identical to pqsignal(), so don't bother.
+ */
+#ifndef WIN32
+
+pqsigfunc
+pqsignal_no_restart(int signo, pqsigfunc func)
+{
+ struct sigaction act,
+ oact;
+
+ act.sa_handler = func;
+ sigemptyset(&act.sa_mask);
+ act.sa_flags = 0;
+#ifdef SA_NOCLDSTOP
+ if (signo == SIGCHLD)
+ act.sa_flags |= SA_NOCLDSTOP;
+#endif
+ if (sigaction(signo, &act, &oact) < 0)
+ return SIG_ERR;
+ return oact.sa_handler;
+}
+
+#endif /* !WIN32 */
+
#endif /* !defined(WIN32) || defined(FRONTEND) */