1. 进行与守护进程有关的预处理
如果配置文件中要求已守护进程启动redis,则进行守护进程的一些预处理。
- 摆脱父进程
- 把
STDIN_FILENO
,STDOUT_FILENO
,STDERR_FILENO
重定位到"/dev/null"
文件中。
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);
}
}
2. 服务器初始化
不太明白为什么服务器初始化要放在中间。
3. 创建进程文件
void createPidFile(void) {
/* Try to write the pid file in a best-effort way. */
FILE *fp = fopen(server.pidfile,"w");
if (fp) {
fprintf(fp,"%d\n",(int)getpid());
fclose(fp);
}
}