PostgreSQL Source Code  git master
pqsignal.c
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * pqsignal.c
4  * reliable BSD-style signal(2) routine stolen from RWW who stole it
5  * from Stevens...
6  *
7  * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
8  * Portions Copyright (c) 1994, Regents of the University of California
9  *
10  *
11  * IDENTIFICATION
12  * src/port/pqsignal.c
13  *
14  * We now assume that all Unix-oid systems have POSIX sigaction(2)
15  * with support for restartable signals (SA_RESTART). We used to also
16  * support BSD-style signal(2), but there really shouldn't be anything
17  * out there anymore that doesn't have the POSIX API.
18  *
19  * Windows, of course, is resolutely in a class by itself. In the backend,
20  * we don't use this file at all; src/backend/port/win32/signal.c provides
21  * pqsignal() for the backend environment. Frontend programs can use
22  * this version of pqsignal() if they wish, but beware that this does
23  * not provide restartable signals on Windows.
24  *
25  * ------------------------------------------------------------------------
26  */
27 
28 #include "c.h"
29 
30 #include <signal.h>
31 
32 #ifndef FRONTEND
33 #include "libpq/pqsignal.h"
34 #endif
35 
36 /*
37  * Set up a signal handler, with SA_RESTART, for signal "signo"
38  *
39  * Returns the previous handler.
40  */
42 pqsignal(int signo, pqsigfunc func)
43 {
44 #if !(defined(WIN32) && defined(FRONTEND))
45  struct sigaction act,
46  oact;
47 
48  act.sa_handler = func;
49  sigemptyset(&act.sa_mask);
50  act.sa_flags = SA_RESTART;
51 #ifdef SA_NOCLDSTOP
52  if (signo == SIGCHLD)
53  act.sa_flags |= SA_NOCLDSTOP;
54 #endif
55  if (sigaction(signo, &act, &oact) < 0)
56  return SIG_ERR;
57  return oact.sa_handler;
58 #else
59  /* Forward to Windows native signal system. */
60  return signal(signo, func);
61 #endif
62 }
pqsigfunc pqsignal(int signo, pqsigfunc func)
Definition: pqsignal.c:42
void(* pqsigfunc)(SIGNAL_ARGS)
Definition: port.h:488
#define SIGCHLD
Definition: win32_port.h:186
#define SIG_ERR
Definition: win32_port.h:172