服务开发经常需要屏蔽的信号

  • 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 }
};