• 守护进程(精灵进程)


    步骤:
       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;
    }

  • 相关阅读:
    2行2列分别使用逗号串连起来
    动态获取数据表或临时表列名
    判断临时表是否存在
    RICOH C4502彩色打印机取消双面打印功能
    UNPIVOT逆透视以及动态逆透视存储过程
    动态透视表
    MS SQL的CASE...WHEN...THEN...END语法
    获取数据库中所有触发器
    动态表名,列名,输入参数,输出参数等
    使用CTE生成辅助表(数字或时间)等
  • 原文地址:https://www.cnblogs.com/edan/p/8886665.html
Copyright © 2020-2023  润新知