学习笔记
代码语言:javascript复制#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
int ngx_deamon(){
switch(fork()){ // fork子进程
case -1:
// 说明子进程创建失败 写一些日志文件
return -1;
case 0:
// 这里是子进程 直接break跳出switch
break;
default :
// 这里是父进程 直接结束
exit(0);
}
// 只有子进程可以走到这里
umask(0); // 设置umask值 确保创建文件的执行权限
if(setsid() == -1){ // 脱离父进程后 创建新的session 并成为leader
/// 创建session出错 写错误日志
return -1;
}
int fd = open("/dev/null", O_RDWR); // 打开空设备
if(fd == -1){
// 文件打开失败 写错误日志
return -1;
}
// 对于dup2函数 如果第二个参数不是新的文件描述符 会先close第二个参数的文件描述符 然后再复制
if(dup2(fd, STDIN_FILENO) == -1){ // 重定向标准输入到空设备
// 写错误日志
return -1;
}
if(dup2(fd, STDOUT_FILENO) == -1){ // 重定向标准输出到空设备
// 写错误日志
return -1;
}
if(fd > STDERR_FILENO){ // 这里的fd应该为3 STDERR_FILENO应该为2
if(close(fd) == -1){ // 关闭空设备文件描述符 目的是不占用系统资源
// 写错误日志
return -1;
}
}
return 1;
}
int main(int argc, char *const *argv)
{
if(ngx_deamon() != 1){
// 守护进程创建失败 失败后的处理
return 1;
}
while(1){
printf("ngx_deamonn");
sleep(1);
}
return 0;
}