6个步骤
步骤1:创建子进程,杀死父进程,目的是为了步骤2中调用setsid可以成功。
步骤2:创建新会话,并自任组长。目的是脱离控制终端
会话组长调用 setsid 会失败,步骤1创建的子进程必然不是会话组长,
这就保证了 setsid 可以成功。
步骤3:修改工作目录为根目录。
当进程没有结束时,工作目录是不能卸载的,为了防止这种情况,
把工作目录设为根目录。因为根目录一般是不用卸载的。
步骤4:修改文件权限掩码,很多情况下,守护进程会创建很多临时文件,
出于安全性考虑,往往不希望这些文件被其他用户查看,这时可以
使用 umask 函数修改文件权限,创建掩码的取值,以满足守护进程的要求。
步骤5:关闭标准输入输出
int daemon_me() { int fd; /* 步骤1: 创建子进程,杀死父进程 */ switch (fork()) { case -1: return -1; case 0: break; default: exit(0); } /* 步骤2: 创建新会话,自任组长 */ if (setsid() == -1) { return -1; } /* 步骤3: 修改工作目录 */ chdir("/"); /* 步骤4: 将文件权限掩码设为0 */ umask(0); /* 步骤5: 关闭标准输入输出 */ fd = open("/dev/null", O_RDWR); if (fd == -1) { return -1; } if (dup2(fd, STDIN_FILENO) == -1) { return -1; } if (dup2(fd, STDOUT_FILENO) == -1) { return -1; } if (dup2(fd, STDERR_FILENO) == -1) { return -1; } if (fd > STDERR_FILENO) { if (close(fd) == -1) { return -1; } } return 0; }