是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);
  }
 }