【Linux】守护进程

目录

进程组

会话

作业控制

实现守护进程


我们在写完一些网络服务后,如果想让这个服务一直在云服务器的后台运行着,那该如何实现呢?其实就用到了这篇博客要讲的守护进程

进程组

我们首先需要了解进程组的概念,其实sleep 1000这条命令运行起来就是进程,我们可以看下面这个例子

我们让这个命令在一个会话(这个概念我们下面会提到)下运行着,新起一个会话查一下sleep

我们可以看到它们三个的PGID(process group)相同,都为sleep 1000的PID(进程组ID一般是第一个进程的ID),也就是说它们属于同一个进程组

并且我们可以看到它们的PPID(父进程ID)相同,其实它们的父进程就是bash(bash的pid和它们的ppid相同)

bash的PID和PGID相同,其实它就是自成一组的,因为会话一建立,bash进程肯定是第一个进程,我们后面启动的不管是命令还是程序都是bash的子进程

所以哪怕只有一个进程,它也会自成进程组

父子进程是同属于一个进程组的,父进程是组长,我们可以验证一下

我们可以从这上面看到父子关系,它们的PGID是相同的

会话

下面我们来谈这个概念,其实OS在有新用户登录的时候是会有一些行为的,一个是新建终端文件,用来和用户交流;另一个就是新建一个bash进程,用来解析用户的命令。

我们说上面的这样一个过程其实就是新建会话(session)

不管是我们新打开一个Xshell登录上还是复制一个ssh渠道

都叫做新起一个会话(复制会话会重新建立1个ssh进程。复制ssh渠道不会重新建立1个ssh进程,只会增加1个pts终端(和当前进程复用))

上面说的新建终端文件在/pts/dev目录下

证明我当前有两个会话

我们可以向这个终端文件中写入东西,其实就会打印到当前的终端上

我们也可以看bash进程的个数

我们可以把三个sleep和父子进程同时启动

这个&符号就是把前面的进程放到后台去运行,这时我们再去查一下

可以看到这是两个进程组,它们的SID(会话ID)相同,它们确实都属于当前这个会话,并且这个SID就是会话中第一个进程的ID,就是bash的PID

所以一个会话是可以建立多个进程组的

前台进程只允许有一个,后台进程可以有一个或多个

并且前台进程是可以被键盘输入的按键(信号)给杀掉的

所以会话刚建立时bash就是前台进程,如果我们运行自己的程序,我们的程序就会变成前台进程,那么bash自动就会切换成后台进程,所以这时我们输入一些指令是没有响应的

上面说不管是前台进程还是后台进程还是进程组,它们都属于一个会话,所以当用户退出时(会话释放),有可能会影响到进程组,这也就是为什么我们要将自己写的网络服务变成守护进程(它有独立的会话,不会受到用户登录或注销的影响)

并且Windows也是有注销功能的,这其实就是关闭当前的会话(关闭掉跟用户有关的进程),然后新起一个会话

作业控制

为什么会有进程组的概念呢?其实就是因为一个进程组完成一项完整的工作。这里的一个进程组就是一个作业

这里把这个进程组放到后台运行,这里显示的1就是作业号,391888是第三个进程的PID

我们可以用下面的指令把1号作业放到前台

当然如果想再放回后台我们现在输指令肯定不行了,前台进程不是bash了,所以ctrl+z先让前台进程暂停,然后用bash把它放到后台,再让它运行起来

这样就可以实现了上面说的作业控制

实现守护进程

有了上面的理论铺垫,下面就可以写一个函数,使调用此函数的程序变成一个守护进程

setsid这个系统调用就是新建一个会话,把当前的程序放到新会话中,但是不能是进程组的组长调用,因为调用setsid的进程会成为新进程组的组长,一个进程不能成为两个进程组的组长!况且,进程组PGID就是进程组组长的PID,难道两个进程组的PGID还能相同?

除此之外我们还要考虑进程的运行路径是否要改变,进程的输出消息到哪里

#include <iostream>
#include <signal.h>
#include <fcntl.h>
void Daemon(bool ischdir, bool isclose)
{signal(SIGCHLD, SIG_IGN);//忽略不需要的信号signal(SIGPIPE, SIG_IGN);if (fork() > 0)exit(0);//父进程为进程组组长,所以退出,用子进程// 子进程setsid();//新建独立会话if (ischdir)chdir("/");//更改工作目录if (isclose)//要么关掉012,要么重定向{close(0);close(1);close(2);}else{int fd = open("/dev/null", O_RDWR);if (fd > 0){dup2(fd, 0); // 将0重定向到fddup2(fd, 1);dup2(fd, 2);close(fd);}}
}

用上面的代码后查询进程

可以看到它的PPID是OS,证明它是孤儿进程,所以守护进程一定是孤儿进程

这是改变工作目录和关闭文件描述符

这是不改变工作目录和不关闭文件描述符

其实OS系统给我们提供了类似于上面代码的系统调用

我们平时直接用即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/18470.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

nginx.conf配置文件中的命令

打开我们的conf文件 nginx.conf文件中&#xff0c;分为3大块&#xff1a; 全局块&#xff0c;就是events和http块之外的内容。设置nginx服务器整体运行的指令 格式为&#xff1a; 指令名 指令值 events块&#xff0c;用于配置与用户的网络连接的内容&#xff0c;对nginx的…

51单片机基础07 实时时钟-思路及代码参考1

目录 一、实现功能 二、思路1的分析 1、定时器0 2、外部中断0 3、主函数main 4、其他重要功能函数 一、实现功能 1、实现最基本的计时功能&#xff0c;显示时、分、秒&#xff0c;可以通过按键设置时间。 要求&#xff1a;时钟计时精确&#xff0c;按键操作不影响计时。…

vTESTstudio系列15--vTESTstudio-Doors的需求和测试用例的管理

最近有朋友在咨询vTESTstudio中怎么去跟Doors里面的需求去做好管理这方面的问题&#xff0c;临时加两篇文章介绍一下,Lets Go!!! 目录 1.Doors的配置&#xff1a; 1.1 安装Doors AddIn for vTESTstudio&#xff1a; 1.2 更新XML脚本&#xff1a; 1.3 导出需求的Trace Item…

基于Java Springboot编程语言在线学习平台

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

JDK安装报错“以下应用程序正在使用需要由此安装程序更新的文件”

&#xff08;一&#xff09;问题描述 我刚刚没有截图&#xff0c;这是我在网上看到的图&#xff1a; &#xff08;二&#xff09;可能的解决办法 1. 下方工具栏右键&#xff0c;打开任务管理器按钮&#xff0c;在进程中找到“Java Platform SE binary” 进程&#xff0c;右键结…

数据库第3次作业

学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系 Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名 Cno为主键 学生选课表&#xff1a;SC (Sno, Cno, Score)…

Linux之文件系统,软硬连接和动静态库

Linux之文件系统&#xff0c;软硬连接和动静态库 一.文件系统1.1磁盘的存储结构1.2CHS和LBA1.3ext2文件系统 二.软硬连接2.1软链接2.2硬链接 三.静态库和动态库3.1静态库与动态库的概念3.2静态库的创建与使用3.3动态库的创建与使用3.4动态库的加载 一.文件系统 在上篇的学习中…

【项目开发】URL中井号(#)的技术细节

未经许可,不得转载。 文章目录 前言一、# 的基本含义二、# 不参与 HTTP 请求三、# 后的字符处理机制四、# 的变化不会触发网页重新加载五、# 的变化会记录在浏览器历史中六、通过 window.location.hash 操作七、onhashchange 事件八、Google 对 # 的处理机制前言 2023 年 9 月…

TikZ 绘图学习笔记

这篇笔记的所有代码如下&#xff1a; % !TEX TS-program pdflatex % !TEX encoding UTF-8 Unicode% This is a simple template for a LaTeX document using the "article" class. % See "book", "report", "letter" for other typ…

Android Framework层介绍

文章目录 前言一、Android Framework 层概述二、主要组件1. 应用程序接口&#xff08;API&#xff09;2. 系统服务3. Binder4. 资源管理5. Content Provider6. 广播接收器&#xff08;BroadcastReceiver&#xff09;7. 服务&#xff08;Service&#xff09; 三、与 Linux Kerne…

如何选择等保服务

在当今信息化高速发展的时代&#xff0c;企业信息系统已成为业务运营的核心支撑&#xff0c;其安全性直接关系到企业的生存与发展。为了应对日益复杂的网络安全威胁&#xff0c;国家推行了等级保护&#xff08;简称等保&#xff09;制度&#xff0c;作为一项基本的信息安全保障…

MCU中的定时器

第一章 定时器的应用场景 第二章 定时器的原理 2.1 定时器的计数原理 1. 定时器的本质是一个计数器&#xff1b; 2. 计数器是对输入的系统频率信号进行计数&#xff1b; 3. 每来一个周期的信号&#xff0c;计数器的cnt 加一。如果周期T表示为1s&#xff0c;来三个周期就表示…

主页任务与计算器任务

一、主页任务 /* Private includes -----------------------------------------------------------*/ //includes #include "user_TasksInit.h" #include "user_ScrRenewTask.h" #include "main.h" #include "rtc.h" #include "…

javascript 入门-01-变量声明

因缘际会 Alice: 编程入门好像很难吧,我能学会吗 ?我虽然是计算机专业的,但是我几乎没怎么写过代码。但是你先别说我菜,我身边的同学大家都是这样的 🤷 Bob: 那你能写冒泡排序或者求数组最大值吗 ? Alice: 冒泡排序写不出来,求数组最大值还能试试看。不过为什么问这个…

富士施乐DocuContre S2520报打开盖子A,取出纸张。代码077-900故障检修

故障描述: 一台富士施乐DocuContre S2520复印机开机报错:打开盖子A,取出纸张。代码077-900故障,用户之前经常卡纸,卡着、卡着就一直提示打开盖子A,取出纸张了;复印机屏幕提示如下图: 故障检修: 富士施乐DocuContre S2520复印机报打开盖子A,取出纸张。077-900的错误代…

MySQL事务相关面试题

MySQL事务 事务的特性是什么&#xff1f; 事务是一组操作的集合&#xff0c;是不可分割的单位&#xff0c;把所有操作作为一个整体要么同时成功&#xff0c;要么同时失败 ACID 并发事务问题 脏读&#xff1a;一个事务读到了另外一个事务还没有提交的数据 不可重复读&#x…

深度学习与飞桨 PaddlePaddle Fluid

编辑推荐 飞桨PaddlePaddle是百度推出的深度学习框架&#xff0c;不仅支撑了百度公司的很多业务和应用&#xff0c;而且随着其开源过程的推进&#xff0c;在其他行业得到普及和应用。 本书基于2019年7月4日发布的飞桨PaddlePaddle Fluid 1.5版本&#xff08;后续版本会兼容旧版…

C++ | Leetcode C++题解之第564题寻找最近的回文数

题目&#xff1a; 题解&#xff1a; using ULL unsigned long long;class Solution { public:vector<ULL> getCandidates(const string& n) {int len n.length();vector<ULL> candidates {(ULL)pow(10, len - 1) - 1,(ULL)pow(10, len) 1,};ULL selfPrefi…

解决IDEA报包不存在,但实际存在的问题

前言 最近在把一个亿老项目交割给同事&#xff0c;同事在导入项目运行时遇到IDEA报包不存在&#xff0c;但实际存在的问题&#xff0c;最终通过以下方式解决 现象 在IDEA里启动运行项目&#xff0c;报某个类有问题&#xff0c;引入的包不存在。 点击这个引入的包&#xff0c;可…

Jenkins下载安装、构建部署到linux远程启动运行

Jenkins详细教程 Winodws下载安装Jenkins一、Jenkins配置Plugins插件管理1、汉化插件2、Maven插件3、重启Jenkins&#xff1a;Restart Safely插件4、文件传输&#xff1a;Publish Over SSH5、gitee插件6、清理插件&#xff1a;workspace cleanup system系统配置1、Gitee配置2、…