守护进程(精灵进程)

步骤:
   1.设置创建文件屏蔽字     <控制新建文件权限>
   2.fork产生孤儿进程       <保证不会是组长进程 确保setsid成功调用>
   3.调用setsid脱离控制终端 <脱离控制终端>//建立一个新会话
   4.更改工作路径到'/'      <防止意外的占用挂载路径 导致无法正常卸载>
   5.关闭不用的文件描述符  并将 stdin stdout stderr 重定向到/dev/null

注:只有第三项是必须的,其他的可以根据用户实际需求写


产生守护进程的函数:
   int daemon(int nochdir, int noclose);

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

#include <time.h>
#include <string.h>

int caretDeamon(void);

int main(void)
{
    int ret;

    ret=caretDeamon();
    if(ret!=0)   return 1;

    int fin;
    fin=open("/tmp/date.txt",O_RDWR|O_TRUNC|O_CREAT,0644);
    //做事情
    time_t  t;
    struct  tm  *tt;
    char    *date;
    while(1)
    {
      t=time(NULL);
      tt=localtime(&t);
      date=asctime(tt);
      write(fin,date,strlen(date));

      sleep(10);
    }
    return 0;
}
int caretDeamon(void)
{
    pid_t pid;
    //产生孤儿进程 避免其为组长进程
    pid=fork();
    if(pid==-1)     return -1;
    else if(pid>0)  exit(0);//
    //child process
    umask(0077);//非必须选项
    
    //printf("pid:%d gid:%d sid:%d ",getpid(),getpgrp(),getsid(getpid()));
    if(setsid()==-1)//脱离控制终端进入后台
    {
        perror("setsid");
        return -2;
    }
    //printf("pid:%d gid:%d sid:%d ",getpid(),getpgrp(),getsid(getpid()));

    //如果无需和用户通过stdin stdout交互 则重定向
    int fd;
    fd=open("/dev/null",O_RDWR);
    if(fd==-1)  return -3;
    dup2(fd,STDIN_FILENO);
    dup2(fd,STDOUT_FILENO);
    dup2(fd,STDERR_FILENO);

    return 0;
}

原文地址:https://www.cnblogs.com/edan/p/8886665.html