PostgreSQL Source Code git master
interrupt.c
Go to the documentation of this file.
1/*-------------------------------------------------------------------------
2 *
3 * interrupt.c
4 * Interrupt handling routines.
5 *
6 * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
8 *
9 * IDENTIFICATION
10 * src/backend/postmaster/interrupt.c
11 *
12 *-------------------------------------------------------------------------
13 */
14
15#include "postgres.h"
16
17#include <unistd.h>
18
19#include "miscadmin.h"
21#include "storage/ipc.h"
22#include "storage/latch.h"
23#include "storage/procsignal.h"
24#include "utils/guc.h"
25#include "utils/memutils.h"
26
27volatile sig_atomic_t ConfigReloadPending = false;
28volatile sig_atomic_t ShutdownRequestPending = false;
29
30/*
31 * Simple interrupt handler for main loops of background processes.
32 */
33void
35{
38
40 {
41 ConfigReloadPending = false;
43 }
44
46 proc_exit(0);
47
48 /* Perform logging of memory contexts of this process */
51}
52
53/*
54 * Simple signal handler for triggering a configuration reload.
55 *
56 * Normally, this handler would be used for SIGHUP. The idea is that code
57 * which uses it would arrange to check the ConfigReloadPending flag at
58 * convenient places inside main loops, or else call ProcessMainLoopInterrupts.
59 */
60void
62{
65}
66
67/*
68 * Simple signal handler for exiting quickly as if due to a crash.
69 *
70 * Normally, this would be used for handling SIGQUIT.
71 */
72void
74{
75 /*
76 * We DO NOT want to run proc_exit() or atexit() callbacks -- we're here
77 * because shared memory may be corrupted, so we don't want to try to
78 * clean up our transaction. Just nail the windows shut and get out of
79 * town. The callbacks wouldn't be safe to run from a signal handler,
80 * anyway.
81 *
82 * Note we do _exit(2) not _exit(0). This is to force the postmaster into
83 * a system reset cycle if someone sends a manual SIGQUIT to a random
84 * backend. This is necessary precisely because we don't clean up our
85 * shared memory state. (The "dead man switch" mechanism in pmsignal.c
86 * should ensure the postmaster sees this as a crash, too, but no harm in
87 * being doubly sure.)
88 */
89 _exit(2);
90}
91
92/*
93 * Simple signal handler for triggering a long-running background process to
94 * shut down and exit.
95 *
96 * Typically, this handler would be used for SIGTERM, but some processes use
97 * other signals. In particular, the checkpointer exits on SIGUSR2, and the WAL
98 * writer and the logical replication parallel apply worker exits on either
99 * SIGINT or SIGTERM.
100 *
101 * ShutdownRequestPending should be checked at a convenient place within the
102 * main loop, or else the main loop should call ProcessMainLoopInterrupts.
103 */
104void
106{
109}
#define SIGNAL_ARGS
Definition: c.h:1320
volatile sig_atomic_t LogMemoryContextPending
Definition: globals.c:40
volatile sig_atomic_t ProcSignalBarrierPending
Definition: globals.c:39
struct Latch * MyLatch
Definition: globals.c:62
void ProcessConfigFile(GucContext context)
Definition: guc-file.l:120
@ PGC_SIGHUP
Definition: guc.h:75
void SignalHandlerForShutdownRequest(SIGNAL_ARGS)
Definition: interrupt.c:105
void ProcessMainLoopInterrupts(void)
Definition: interrupt.c:34
volatile sig_atomic_t ShutdownRequestPending
Definition: interrupt.c:28
volatile sig_atomic_t ConfigReloadPending
Definition: interrupt.c:27
void SignalHandlerForConfigReload(SIGNAL_ARGS)
Definition: interrupt.c:61
void SignalHandlerForCrashExit(SIGNAL_ARGS)
Definition: interrupt.c:73
void proc_exit(int code)
Definition: ipc.c:104
void SetLatch(Latch *latch)
Definition: latch.c:288
void ProcessLogMemoryContextInterrupt(void)
Definition: mcxt.c:1289
void ProcessProcSignalBarrier(void)
Definition: procsignal.c:498