pg_regress: Disable autoruns for cmd.exe on Windows
[pgsql.git] / src / port / pqsignal.c
blob9b884890e6c5795caf4df3a9ad20781d869be416
1 /*-------------------------------------------------------------------------
3 * pqsignal.c
4 * reliable BSD-style signal(2) routine stolen from RWW who stole it
5 * from Stevens...
7 * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
11 * IDENTIFICATION
12 * src/port/pqsignal.c
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
18 * handler was reset.
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 * ------------------------------------------------------------------------
46 #include "c.h"
48 #include <signal.h>
50 #ifndef FRONTEND
51 #include "libpq/pqsignal.h"
52 #endif
55 * Set up a signal handler, with SA_RESTART, for signal "signo"
57 * Returns the previous handler.
59 pqsigfunc
60 pqsignal(int signo, pqsigfunc func)
62 #if !(defined(WIN32) && defined(FRONTEND))
63 struct sigaction act,
64 oact;
66 act.sa_handler = func;
67 sigemptyset(&act.sa_mask);
68 act.sa_flags = SA_RESTART;
69 #ifdef SA_NOCLDSTOP
70 if (signo == SIGCHLD)
71 act.sa_flags |= SA_NOCLDSTOP;
72 #endif
73 if (sigaction(signo, &act, &oact) < 0)
74 return SIG_ERR;
75 return oact.sa_handler;
76 #else
77 /* Forward to Windows native signal system. */
78 return signal(signo, func);
79 #endif