• 守护进程


    守护进程的特点

    • 后台服务进程
    • 独立于控制终端
    • 周期性执行某任务
    • 不受用户登录注销影响
    • 一般采用以d结尾的名字

    进程组

    进程组的组长

    • 组里边的第一个进程就是该组的组长
    • 进程组的ID等于组长的ID

    会话(多个进程组)

    创建一个会话的注意事项:

    • 进程组长不能创建会话
    • 创建会话的进程成为新进程组的组长
    • 创建出的会话会丢弃原有的控制终端

    获取进程所属的会话ID:

    • pid_t getsid(pid_t pid);

    创建一个会话:

    • pid_t setsid(void);

    创建守护进程的流程

    1. fork子进程,父进程退出
    2. 子进程创建新会话
    3. 改变当前目录到一个不可卸载目录
    4. 重设文件掩码(子进程会继承父进程掩码,重设掩码可以增加子进程的灵活性)
    5. 关闭文件描述符(由于守护进程和终端脱离,可以关闭0,1,2描述符释放资源)
    6. 执行核心工作

    创建一个守护进程,每隔2s获取一次系统时间,将这个时间写入到磁盘文件中

    #include <stdio.h>
    #include <signal.h>
    #include <unistd.h>
    #include <sys/time.h>
    #include <time.h>
    #include <fcntl.h>
    
    void dowork(int no)
    {
            time_t curtime;
            //得到当前系统时间
            time(&curtime);
            //格式化时间
            char *pt = ctime(&curtime);
            //将时间写入文件
            int fd = open("/home/badou/linux_learning/temp+++.txt", O_CREAT | O_WRONLY | O_APPEND, 0664);
            write(fd, pt, strlen(pt)+1);
            close(fd);
    }
    
    int main()
    {
            pid_t pid = fork();
            if(pid > 0)
            {
                    //父进程退出
                    exit(1);
            }
            else if(pid == 0)
            {
                    //创建会话
                    setsid();
                    //改变进程的工作目录
                    chdir("/home/badou/linux_learning");
                    //重置文件掩码
                    umask(0);
                    //关闭文件描述符
                    close(STDIN_FILENO);
                    close(STDOUT_FILENO);
                    close(STDERR_FILENO);
    
                    //执行核心操作
                    //注册信号捕捉
                    struct sigaction act;
                    act.sa_flags = 0;
                    act.sa_handler = dowork;
                    sigemptyset(&act.sa_mask);
                    sigaction(SIGALRM, &act, NULL);
                    //创建定时器
                    struct itimerval val;
                    //第一次触发时间
                    val.it_value.tv_usec = 0;
                    val.it_value.tv_sec = 2;
                    //循环周期
                    val.it_interval.tv_usec = 0;
                    val.it_interval.tv_sec = 1;
                    setitimer(ITIMER_REAL, &val, NULL);
    
                    while(1);
            }
            return 0;
    }
    View Code
  • 相关阅读:
    Linux文档目录结构
    Git
    Scrapy爬虫框架(架构图与解析)
    爬虫(总目录)
    Django模型(Meta Optins)
    Django模型(字段关系)
    Django模型(模型类)
    Django模型(索引)
    Django模型(字段选项)
    Django模型(字段类型)
  • 原文地址:https://www.cnblogs.com/xumaomao/p/13088661.html
Copyright © 2020-2023  润新知