守护进程的创建方法
-
创建子进程,父进程退出;
if (fork > 0){
exit(0);
}
子进程变成孤儿进程,被init进程收养;
子进程在后台运行; -
子进程创建新会话;
if (setid < 0){
exit(-1);
}
子进程成为新的会话组长;
子进程脱离原先的终端。 -
更改当前工作目录(不是必需的)
chdir(“/”);
守护进程一直在后台运行,其工作目录不能被卸载;
重新设定当前工作目录cwd。 -
重设文件权限掩码
if (umask(0) < 0){
exit(-1);
}
文件权限掩码设置为0
只影响当前进程。 -
关闭打开的文件描述符
int i;
for (i = 0; i < 3; i++){
close(i);
}
关闭所有从父进程继承的打开文件;
已脱离终端,stdin/stdout/stderr无法再使用。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
int main(){
pid_t pid;
pid = fork();
if (pid < 0){
perror("fork");
return 0;
}else if(pid > 0){
exit(0);
}
if (setsid(0) < 0){
perror("setsid");
exit(0);
}
chdir("/");
if (umask(0) < 0){
perror("umask");
exit(0);
}
close(0);
close(1);
close(2);
}