Redis 7.0.5 源码阅读笔记:Redis 守护进程的实现

Redis205 字

实现代码

Redis 的守护进程实现代码是在 src/server.c 的第 6094 行,其代码如下:

void daemonize(void) {
    int fd;

    if (fork() != 0) exit(0); /* parent exits */
    setsid(); /* create a new session */

    /* Every output goes to /dev/null. If Redis is daemonized but
     * the 'logfile' is set to 'stdout' in the configuration file
     * it will not log at all. */
    if ((fd = open("/dev/null", O_RDWR, 0)) != -1) {
        dup2(fd, STDIN_FILENO);
        dup2(fd, STDOUT_FILENO);
        dup2(fd, STDERR_FILENO);
        if (fd > STDERR_FILENO) close(fd);
    }
}

redis 的守护进程很简单执行流程如下。

  1. 调用 fork 派生子进程
  2. 调用成功后退出父进程
  3. 设置新的 session_id
  4. 关闭标准输入、标准输出和标准错误
  5. 判断文件描述符如果大于标准错误,则直接关闭 fd

在每一个进程打开,都会默认打开三哥文件描述符。


#define     STDIN_FILENO    0    /* standard input file descriptor */
#define    STDOUT_FILENO    1    /* standard output file descriptor */
#define    STDERR_FILENO    2    /* standard error file descriptor */

## 调用位置
int background = server.daemonize && !server.supervised;
if (background) daemonize();

服务端结构体 redisServer  存储 Redis 服务器的所有信息,包括但不限于数据库、配置参数、命令表、监听端口与地址、客户端列表、若干统计信息、RDB与AOF持久化相关信息、主从复制相关信息、集群相关信息等。

这是一个全局变量,在 server.c 第 86 行被声明。
maksim
Maksim(一笑,吡罗),PHPer,Goper
OωO
开启隐私评论,您的评论仅作者和评论双方可见