1
2 /*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) NGINX, Inc.
5 */
6
7 #include <nxt_main.h>
8 #include <nxt_runtime.h>
9 #include <nxt_port.h>
10 #include <nxt_main_process.h>
11 #include <nxt_router.h>
12
13
14 static void nxt_signal_handler(nxt_task_t *task, void *obj, void *data);
15 static void nxt_signal_sigterm_handler(nxt_task_t *task, void *obj, void *data);
16 static void nxt_signal_sigquit_handler(nxt_task_t *task, void *obj, void *data);
17
18
19 const nxt_sig_event_t nxt_process_signals[] = {
20 nxt_event_signal(SIGHUP, nxt_signal_handler),
21 nxt_event_signal(SIGINT, nxt_signal_sigterm_handler),
22 nxt_event_signal(SIGQUIT, nxt_signal_sigquit_handler),
23 nxt_event_signal(SIGTERM, nxt_signal_sigterm_handler),
24 nxt_event_signal(SIGCHLD, nxt_signal_handler),
25 nxt_event_signal(SIGUSR1, nxt_signal_handler),
26 nxt_event_signal(SIGUSR2, nxt_signal_handler),
27 nxt_event_signal_end,
28 };
29
30
31 static void
nxt_signal_handler(nxt_task_t * task,void * obj,void * data)32 nxt_signal_handler(nxt_task_t *task, void *obj, void *data)
33 {
34 nxt_trace(task, "signal signo:%d (%s) recevied, ignored",
35 (int) (uintptr_t) obj, data);
36 }
37
38
39 void
nxt_signal_quit_handler(nxt_task_t * task,nxt_port_recv_msg_t * msg)40 nxt_signal_quit_handler(nxt_task_t *task, nxt_port_recv_msg_t *msg)
41 {
42 nxt_process_quit(task, 0);
43 }
44
45
46 static void
nxt_signal_sigterm_handler(nxt_task_t * task,void * obj,void * data)47 nxt_signal_sigterm_handler(nxt_task_t *task, void *obj, void *data)
48 {
49 nxt_debug(task, "sigterm handler signo:%d (%s)",
50 (int) (uintptr_t) obj, data);
51
52 /* A fast exit. */
53
54 nxt_runtime_quit(task, 0);
55 }
56
57
58 static void
nxt_signal_sigquit_handler(nxt_task_t * task,void * obj,void * data)59 nxt_signal_sigquit_handler(nxt_task_t *task, void *obj, void *data)
60 {
61 nxt_debug(task, "sigquit handler signo:%d (%s)",
62 (int) (uintptr_t) obj, data);
63
64 /* A graceful exit. */
65
66 nxt_process_quit(task, 0);
67 }
68