服务开发经常需要屏蔽的信号
- SIGHUP
#define SIGHUP 1/* hangup */- SIGHUP是Unix系统管理员很常用的一个信号。许多后台服务进程在接受到该信号后将会重新读取它们的配置文件。然而,该信号的实际功能是通知进程它的控制终端被断开。缺省行为是终止进程。
- SIGPIPE
#define SIGPIPE 13/* write on a pipe with no one to read it */- 管道的作用就像电话一样,允许进程之间的通信。如果进程尝试写管道,然而管道的另一边却没有读者,操作系统会将SIGPIPE信号交付给这个讨厌的进程(这里就是那个打算写入的进程)。缺省行为是终止进程。
- SIGSYS
#define SIGSYS 12/*non-existent system call invoked*/- SIGSYS信号会在进程执行一个不存在的系统调用时被交付。操作系统会交付该信号,并且进程会被终止。缺省行为是终止进程,并且创建一个核心转储。
Redis源码
// src/server.c
// 初始化服务器
void initServer(void) {
int j;
signal(SIGHUP, SIG_IGN); // 忽略 SIGHUP 信号
signal(SIGPIPE, SIG_IGN); // 忽略 SIGPIPE 信号
setupSignalHandlers(); // 建立信号处理函数
...
}Nginx源码
// ngx_process.c
typedef struct {
int signo; // 待处理信号
char *signame; // 信号对应字符串名称
char *name; // 信号对应的Nginx命令
void (*handler)(int signo, siginfo_t *siginfo, void *ucontext);// 触发后回调函数
} ngx_signal_t;
ngx_signal_t signals[] = {
{ ngx_signal_value(NGX_RECONFIGURE_SIGNAL),
"SIG" ngx_value(NGX_RECONFIGURE_SIGNAL),
"reload",
ngx_signal_handler },
...
{ SIGALRM, "SIGALRM", "", ngx_signal_handler },
{ SIGINT, "SIGINT", "", ngx_signal_handler },
{ SIGIO, "SIGIO", "", ngx_signal_handler },
{ SIGCHLD, "SIGCHLD", "", ngx_signal_handler },
{ SIGSYS, "SIGSYS, SIG_IGN", "", NULL },
{ SIGPIPE, "SIGPIPE, SIG_IGN", "", NULL },
{ 0, NULL, "", NULL }
};