守护进程简单实现

1》#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
#include <time.h>

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

void touchfile(int num)
{
    char *HomeDir = getenv("HOME");
    char strFilename[256]={0};
    
    sprintf(strFilename,_FILE_NAME_FORMAT_,HomeDir,time(NULL));

    int fd = open(strFilename,O_RDWR|O_CREAT,0666);

    if(fd < 0){
        perror("open err");
        exit(1);
    }
    close(fd);
}


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


    sigaction(SIGALRM,&act,NULL);
    while(1){
        //每隔1分钟在/home/itheima/log 下创建文件
        sleep(1);
        //do sth 
    }
    // 退出

    return 0;

}


2》

#define CREATE_DAEMON if(fork()>0)exit(1);setsid();


3》

#define INIT_DAEMON \
{ \
if(fork() >0) exit(0); \
setsid(); \
if(fork()>0) exit(0); \
}


会话:进程组的更高一级,多个进程组对应一个会话。
进程组:多个进程在同一个组,第一个进程默认是进程组的组长
创建会话的时候,组长不可以创建,必须是组员创建。
创建会话的步骤:创建子进程,父进程去死,子进程自当会长。
守护进程:脱离终端控制,在后台运行,周期执行一系列任务的进程



守护进程的步骤:

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










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值