1 /*-------------------------------------------------------------------------
4 * reliable BSD-style signal(2) routine stolen from RWW who stole it
7 * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
14 * This is the signal() implementation from "Advanced Programming in the UNIX
15 * Environment", with minor changes. It was originally a replacement needed
16 * for old SVR4 systems whose signal() behaved as if sa_flags = SA_RESETHAND |
17 * SA_NODEFER, also known as "unreliable" signals due to races when the
20 * By now, all known modern Unix systems have a "reliable" signal() call.
21 * We still don't want to use it though, because it remains
22 * implementation-defined by both C99 and POSIX whether the handler is reset
23 * or signals are blocked when the handler runs, and default restart behavior
24 * is also unspecified. Therefore we take POSIX's advice and call sigaction()
25 * so we can provide explicit sa_flags, but wrap it in this more convenient
26 * traditional interface style. It also provides a place to set any extra
27 * flags we want everywhere, such as SA_NOCLDSTOP.
29 * Windows, of course, is resolutely in a class by itself. In the backend,
30 * this relies on pqsigaction() in src/backend/port/win32/signal.c, which
31 * provides limited emulation of reliable signals.
33 * Frontend programs can use this version of pqsignal() to forward to the
34 * native Windows signal() call if they wish, but beware that Windows signals
35 * behave quite differently. Only the 6 signals required by C are supported.
36 * SIGINT handlers run in another thread instead of interrupting an existing
37 * thread, and the others don't interrupt system calls either, so SA_RESTART
38 * is moot. All except SIGFPE have SA_RESETHAND semantics, meaning the
39 * handler is reset to SIG_DFL each time it runs. The set of things you are
40 * allowed to do in a handler is also much more restricted than on Unix,
41 * according to the documentation.
43 * ------------------------------------------------------------------------
51 #include "libpq/pqsignal.h"
55 * Set up a signal handler, with SA_RESTART, for signal "signo"
57 * Returns the previous handler.
60 pqsignal(int signo
, pqsigfunc func
)
62 #if !(defined(WIN32) && defined(FRONTEND))
66 act
.sa_handler
= func
;
67 sigemptyset(&act
.sa_mask
);
68 act
.sa_flags
= SA_RESTART
;
71 act
.sa_flags
|= SA_NOCLDSTOP
;
73 if (sigaction(signo
, &act
, &oact
) < 0)
75 return oact
.sa_handler
;
77 /* Forward to Windows native signal system. */
78 return signal(signo
, func
);