守护进程(精灵进程)

目录

前言

1.如何理解前台进程和后台进程

2.守护进程的概念

3.为什么会存在守护进程

4.如何实现守护进程

5.测试

总结


前言

今天我们要介绍的是关于守护进程如何实现,可能有小伙伴第一次听到守护进程这个概念,感觉很懵,知道进程的概念,但是不知道守护进程是什么,它是否和进程有关联,以及守护进程有什么意义,带着这些疑问,下面,我们就一起来慢慢揭晓这些答案,相信看完这篇文章之后,关于守护进程的话题,你将会有一个清晰的认识。

1.如何理解前台进程和后台进程

如图所示:

jobs:查看后台进程

例:

cpp 复制代码
[myl@VM-8-12-centos tcp]$ sleep 1000&   
[1] 5492
[myl@VM-8-12-centos tcp]$ sleep 1000 | sleep 2000 &
[2] 6514
[myl@VM-8-12-centos tcp]$ jobs
[1]-  Running                 sleep 1000 &
[2]+  Running                 sleep 1000 | sleep 2000 &

说明:&表示将该进程设置为后台进程运行,jobs查看后台进程,前面的数字代表作业编号

PGID:代表同一个进程组,一般将一个进程组中的第一个称为是组长,多个进程共同完成一个作业

SID:代表会话ID,不同进程组会话ID相同,代表属于同一个会话

fg + 作业编号:代表将该进程设置为前台进程

ctrl + Z:暂停该进程,并放到后台

bg + 作业编号,启动该进程

cpp 复制代码
[myl@VM-8-12-centos tcp]$ jobs
[1]-  Running                 sleep 1000 &
[2]+  Running                 sleep 1000 | sleep 2000 &
[myl@VM-8-12-centos tcp]$ fg 2
sleep 1000 | sleep 2000
ls
pwd  
^Z[1]   Done                    sleep 1000

[2]+  Stopped                 sleep 1000 | sleep 2000
[myl@VM-8-12-centos tcp]$ jobs
[2]+  Stopped                 sleep 1000 | sleep 2000
[myl@VM-8-12-centos tcp]$ bg 2
[2]+ sleep 1000 | sleep 2000 &
[myl@VM-8-12-centos tcp]$ jobs
[2]+  Running                 sleep 1000 | sleep 2000 &

所以作业是可以前后台进行切换的。

当客户端退出的时候,之前的进程也就退出了,包括前台进程和后台进程

2.守护进程的概念

上面我们介绍了前台进程和后台进程,前台进程只能有一个,而后台进程可以有多个,可以互相切换,都属于同一个会话,共同特点就是当客户端退出之后不管是前台进程还是后台进程,都会退出,而我们今天要介绍的守护进程是自成会话,自成进程组和终端设备无关,除非使用kill命令终止该进程,否则将一直运行,将这种进程被称为是守护进程。

3.为什么会存在守护进程

当实现了一款服务器,服务器启动之后对外提供服务,不能因为客户端退出,而服务进程也跟着退出了,所以一般将服务进程会设置为守护进程,一直对外提供服务。

4.如何实现守护进程

setsid()函数:生成一个会话ID,自成一个会话

cpp 复制代码
#include <unistd.h>

pid_t setsid(void);

使用说明:调用该函数的进程不能是进程组的组长

实现代码:

cpp 复制代码
#pragma once

#include<signal.h>
#include<unistd.h>
#include<cstdlib>
#include<cassert>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define DEV "/dev/null" 
void daemonSelf(const char* curPath = nullptr)
{
    //1.让调用进程忽略掉异常的信号
    signal(SIGPIPE,SIG_IGN);
    //2.让自己变成守护进程的前提:以非组长的身份调用setsid
    if(fork() > 0)
        exit(0);
    //子进程 --- 守护进程,精灵进程,本质是孤儿进程的一种
    pid_t n = setsid();
    assert(n != -1);
    //3.守护进程默认是脱离终端的,关闭或者重定向以前进程默认打开的文件:
    //dev/null文件的特点:向该文件中写入内容,会自动清空
    int fd = open(DEV,O_RDWR);
    if(fd >= 0)
    {
        dup2(fd,0);
        dup2(fd,1);
        dup2(fd,2);
    }
    else
    {
        close(0);
        close(1);
        close(2);
    }
    //4.可选,进程执行路劲发生更改:
    if(curPath)
        chdir(curPath);
}

此时就可以在服务器初始化完成,启动之前将该进程设置为服务进程,至此该进程就不会再退出

5.测试

运行截图:

此时通过图片观察到,当服务器启动之后,不再像之前那样变为前台进程,而是自成会话作为后台进程,被其它客户端访问。

总结

相信看完之后,大家对守护进程是什么就非常熟悉了,今天关于守护进程的介绍就到这里了,感谢大家的阅读,我们下次再见。

相关推荐
律宏阔2 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔2 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴2 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千2 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei372 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei372 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei372 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
judezh3 小时前
api 容器一直 unhealthy?我把一个 Agent 运行时的健康检查逐条拆了,查出四个问题
运维·docker
GeW3 小时前
制造业高端化,为什么必须重估Linux和数据库?
linux
百万蹄蹄向前冲3 小时前
双端同步!云服务器装最新Node.js v26.10全过程追踪
服务器·人工智能·node.js