守护进程

守护进程
会话:进程组的更高一级,多个进程组对应一个会话
进程组:多个进程在同一个组,第一个进程默认是进程组的组长
创建会话的时候,组长不可以创建,必须由组员创建
创建会话的步骤:创建子进程,父进程终止,子进程成为会长

守护进程的步骤:
创建子进程fork
父进程退出
子进程当会长setsid,
切换工作目录$HOMR
设置掩码umask
关闭文件描述符0,1,2(为了避免浪费资源)
执行核心逻辑
退出

创建一个守护进程,每分钟在$HOME/log/下创建一个文件:程序名.时间戳
daemon.c

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#inlcude <signal.h>
#include <time.h>
#include <sys/time.h>
#include <sys/type.h>
#include <sys/stat.h>

#define _FILE_NAMR_FORMAT_  "%s/log/mydaemon.%ld" //定义文件格式化

void touchfile(int num)
{
    char *Homedir=getenv("HOME");
    char strFilename[256]={0};
    sprintf(strFilename,_FILE_NAMR_FORMAT_,Homedir,time(NULL));
    int fd=open(strFilename,O_RDWR|O_CREAT,0666);
    if(fd<0){
        perrpr("open err");
        exit(1);
    }
    close(fd);
}

int main()
{
    //创建子进程,父进程退出
    pid_t pid=fork();
    if(pid>0){
        exit(1);
    }
    //当会长
    setsid();
    //设置掩码
    umask(0);
    //切换目录
    chdir(getenv("HOME")); //切换到家目录
    //关闭文件描述符
    //执行核心逻辑
    struct itimerval myit={{60,0},{60,0}};
    setitimer(ITIMER_REAL,&myit,NULL);
    struct sigaction act;
    act.sa_flags=0;
    sigempty(&act.sa_mask);
    act.sa_handler=touchfile;

    sigaction(SIGALRM,&act,NULL);
    while(1){
        //每分钟在$HOME/log/下创建一个文件
        sleep(1);      
    }
    //退出

    return 0;
}

精简版:
daemon.c

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#inlcude <signal.h>
#include <time.h>
#include <sys/time.h>
#include <sys/type.h>
#include <sys/stat.h>

int main()
{
    char strFilename[256]={0};

    while(1){
        memset(strFilename,0x00,sizeof(strFilename));
        sprintf(strFilename,_FILE_NAMR_FORMAT_,Homedir,time(NULL));
        int fd=open(strFilename,O_RDONLY|O_CREAT,0664);
        if(fd<0){
            perrpr("open err");
            exit(1);
        }
        close(fd);
        sleep(5);      
    }
    return 0;
}

扩展了解:
通过nohup指令也可以达到守护进程创建的效果
nohup cmd [>1.log]&
nohup指令会让cmd收不到SIGCUP信号
&代表后台运行

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给算法爸爸上香

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值