Domin1c0's Blog

A technical blog sharing my journey in programming, development, and open source.

View on GitHub
22 July 2025

Daemon

by

Daemon 守护进程

介绍

守护进程特点:

进程组和会话

进程组

会话

创建守护进程的模型

void myfunc(int signo)
{
    //打开文件
    int fd = open("mydaemon.log", O_RDWR | O_CREAT, 0755);
    if(fd<0)
    {
        return;
    }

    //获取当前系统时间
    time_t t;
    time(&t);
    char *p = ctime(&t);
    #将时间写入文件
    if(p != NULL){
        write(fd, p, strlen(p));
    }

    close(fd);

    return;
}
int main()
{
    //父进程fork子进程,然后父进程退出
    pid_t pid = fork();
    if(pid > 0  | pid < 0)
    {
        exit(1);
    }

    //子进程调用setsid函数创建会话
    setsid();

    //改变当前工作目录
    chdir("/home/domin1c/log");

    //改变文件掩码
    umask(0000);

    //关闭标准输入输出错误输出文件描述符
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    //核心操作
    //注册信号处理符号
    struct sigaction act;
    act.sa_handler = myfunc;
    act.sa_flags = 0;
    sigemptyset(&act.sa_mask);
    sigaction(SIGALRM,&act,NULL);

    //设置时钟
    struct itimerval tm;
    tm.it_interval.tv_sec = 2;
    tm.it_interval.tv_usec = 0;
    tm.it_value.tv_sec = 3;
    tm.it_value.tv_usec = 0;
    setitimer(ITMER_REAL, &tm, NULL);

    while(1)
    {
        sleep(1);
    }
}
tags: 进程 - 守护进程