linux--守护进程

守护进程在Linux系统中扮演重要角色,常用于后台执行任务或提供服务器服务。它们独立于控制终端,不受用户登录注销影响,持续运行。本文介绍了守护进程的特性,历史演变,并提供了通过`ps axj`命令查看守护进程的方法,以及调用`daemon`函数创建守护进程的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是守护进程

守护进程也称精灵进程(Daemon),是运⾏在后台的⼀种特殊进程。它独⽴于控制终端并且周期性地执⾏某种任务或等待处理某些发⽣的事件。守护进程是⼀种很有⽤的进程。 Linux的⼤多数服务器就是⽤守护进程实现的。⽐如, ftp服务器, ssh服务器, Web服务器httpd等。同时,守护进程完成许多系统任务。⽐如,作业规划进程crond等。
Linux系统启动时会启动很多系统服务进程,这些系统服务进程没有控制终端,不能直接和⽤户交互。其它进程都是在⽤户登录或运⾏程序时创建,在运⾏结束或⽤户注销时终⽌,但系统服务进程(守护进程)不受⽤户登录注销的影响,它们⼀直在运⾏着。这种进程有⼀个名称叫守护进程(Daemon)。

守护进程有如下几个特点:

  • 独立于控制终端,不与任何终端建立联系
  • 不受用户的登陆注销的影响
  • 运行在后台
守护进程的“进化史”

在这里插入图片描述

代码实现

//守护进程进化史:
//1.创建一个孤儿进程
//2.在孤儿进程内创建一个新会话
//3.修改默认工作路径为"/"
//4.重定向文件描述符到"/dev/null"
//5.设置文件的默认权限掩码
//6.确保自身不是会话首进程,从而不和任何终端建立联系
//7,成功逆袭成为守护进程
#include<iostream>
#include<unistd.h>
#include<stdlib.h>
#include<error.h>
#include<fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
void MyDaemon()
{
    int pid = fork();
    if (pid < 0)
    {
        exit(-1);
    }
    else if (pid > 0)
    {
        exit(0);
    }
        //创建孤儿进程完成
        int sid = setsid();
        if (sid < 0)
        {
            exit(-1);
        }
        //创建会话完成
        
        chdir("/");//修改默认工作路径

        int fd = open("/dev/null",O_RDWR);
        dup2(fd,0);
        dup2(fd,1);
        dup2(fd,2);//文件描述符重定向

        umask(0);//修改默认权限

        pid = fork();
        if (pid < 0)
        {
            exit(-1);
        }
        else if (pid > 0)
        {
            exit(0);
        }
        //创建孙子进程,孙子进程不是该会话的首进程(受进程是刚才退出的孤儿进程,)。
        //这样做能保证该进程不和任何终端建立联系。

}//创建成功


int main()
{
    MyDaemon();
    while(1)
    {
      sleep(1);
    }
    return 0;
}

⽤ps axj命令查看系统中的进程。参数a表⽰不仅列当前⽤户的进程,也列出所有其他⽤ 户的进程,参
数x表⽰不仅列有控制终端的进程,也列出所有⽆控制终端的进程,参数j表⽰列出与 作业控制相关的信息。
测试结果:
在这里插入图片描述

其中PPID等于1说明他是一个孤儿进程,TTY 等于 ?说明不与任何任何终端有联系。


当然创建守护进程也可以调用deamon函数:

 #include <unistd.h>

       int daemon(int nochdir, int noclose);
参数:
		nochdir: 为0则修改默认工作路径
		noclose:为0则重定向文件描述符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值