是linux的后台服务进程。它是一个生存周期较长的进程,没有控制终端,输出无处显示。用户层守护进程的父进程是init进程。
守护进程创建步骤:
1、创建子进程,父进程退出,子进程被init自动收养;fork exit
2、调用setsid创建新会话,成为新会话的首进程,成为新进程组的组长进程,摆脱父进程继承过来的会话、进程组等;setsid
3、改变当前目录为根目录,保证工作的文件目录不被删除;chdir(“/”)
4、重设文件权限掩码,给子进程更大的权限;umask(0)
5、关闭不用的文件描述符,因为会消耗资源;close
一个守护进程的实例:每隔10s写入一个“tick”
#include<stdio.h>
#include<string.h>
#include<fcntl.h>
#include<unistd.h>
#include<sys/types.h>
#define MAXFILE 65535
int main()
{
int fd,len,i; pid_t pid;
char *buf = "tick\n";
len = strlen(buf);
if((pid = fork()) < 0)
{
perror("fork failed"); exit(1);
}
else if(pid > 0){ exit(0); 这边父进程退出 只留下子进程
}
setsid();
if(chdir("/") < 0){
perror("chdir failed");
exit(1);
}
umask(0);
for(i = 0; i < MAXFILE; i++){
close(i);
}
while(1){
if((fd = open("/tmp/dameon.log", O_CREAT | O_WRONLY | O_APPEND, 0600)) < 0){
perror("open log failed");
exit(1);
}
write(fd, buf, len+1);
close(fd);
sleep(10);
}
}