Linux基础 | 守护进程


前言


提示:以下是本篇文章正文内容,下面案例可供参考

一、守护进程是什么?

守护进程是在后台为用户提供服务且不需要与用户进行交互的一种程序。
**会话:**在操作系统中每打开一个中断就伴随着一个会话的产生
会话首进程:在一个会话中执行的第一个进程,在Linux中一般是命令解释器
**会话ID(SID):**该会话首进程的PID就是该会话的ID
进程组:操作系统上每执行一个进程,就会产生一个进程组,该进程为该进程组的组长,该进程的PID为该进程组的ID(获取函数get_pgrp);
在这里插入图片描述

二、编程流程

在这里插入图片描述

三、使用步骤

1.后台运行,每隔五秒输出一次时间

代码如下(示例):

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


//一个终端就是一个会话,一般一个会话的首进程是bash,执行一个指令就会产生一个进程组
void set_demon()
{
    pid_t pid=fork();
    if(pid!=0)//结束父进程,因为父进程是组长进程,且是该会话的首进程,它的PID标识着
    {         //该组进程的GID
        exit(0);
    }

    setsid();//创建新会话,必须是一个普通组员进程

    pid=fork();
    if(pid!=0)
    {
        exit(0);
    }

    chdir("/");//将自己添加到根目录下边,防止被卸载
    umask(0);//消除掩码,获取文件的本来权限
    int size=getdtablesize();//获得当前打开的所有文件描述符
    for(int i=0;i<size;i++)//关闭所有描述符
    {
        close(i);
    }
}
int main()
{
    set_demon();//将该进程变成守护进程
    while(1)
    {    
        FILE*fp=fopen("/tmp/c215.log","a");
        if(NULL==fp)
        {
            break;
        }
        time_t tv;
        time(&tv);//time() 从1970年开始到现在的秒数
        char*s=asctime( localtime(&tv) );//localtime():将描述转化成本地时间;
                                  //asctime():将时间转化成字符串
        fprintf(fp,"time is %s",s);
        fclose(fp);

        sleep(5);
    }
    
    return 0;
}

2.输出结果

在这里插入图片描述


总结

fork();//退出父进程保留子进程
setsid();//子进程移动得新会话里
fork();//刚才的子进程变成父进程,退出父进程,失去进程组组长身份,保留子进程。
chdir"/"//新的子进程移动到根目录下面
umask(0);//清除掩码
close()//关闭所有文件描述符
处理僵死进程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值