守护进程

会话:进程组的更高一级,多个进程组对应一个会话。
进程组:多个进程在同一个组,第一个进程默认是进程组的组长。
创建会话的时候,组长不可以创建,必须是组员创建。
创建会话的步骤:创建子进程,父进程退出,子进程自当会长。

守护进程的步骤(红色必须步骤):
1.创建子进程fork
2.父进程退出
3.子进程当会长setid
4.切换工作目录$HOME
5.设置掩码 umask
6.关闭文件描述符0,1,2,为了避免浪费资源
7.执行核心逻辑
8.退出

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

#define _FILE_NAME_FORMAT_ "%s/work/linux_c/daemon/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(int argc, char const *argv[])
{
    //创建子进程,父进程推出
    pid_t pid = fork();
    if (pid > 0)
    {
        exit(1);
    }
    //当会长
    if (setsid() == -1)
    {
        perror("setsid error");
        return;
    }
    //设置掩码
    umask(0);
    //切换目录
    chdir(getenv("HOME"));
    //关闭文件描述符
    //close(1), close(1), close(2);
    //执行核心逻辑        //每隔10秒在/home/wyl/log下创建文件
    struct itimerval myit = { {10, 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)
    {
        sleep(1);
    }
    //退出
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值