C/C++轻量级并发TCP服务器框架Zinx-游戏服务器开发005:守护进程与进程监控

news2024/10/5 13:03:02

文章目录

  • 1 守护进程
    • 1.1 进程组和会话
    • 1.2 会话的相关概念
    • 1.3 守护进程的概念
    • 1.4 守护线程的特点
    • 1.5 守护进程创建的基本步骤
    • 1.6 本项目守护进程的实现
  • 2 进程监控
    • 2.1 进程监控的实现

1 守护进程

1.1 进程组和会话

进程除了有进程的PID之外还有一个进程组,进程组是由一个进程或者多个进程组成。通常他们与同一作业相关联可以收到同一终端的信号。

每个进程组有唯一的进程组ID,每个进程组有一个进程组组长。如何判断一个进程是不是这个进程组的组长了,通常进程组ID等于进程ID那么这个进程就是对应进程组的组长。

1.2 会话的相关概念

会话是有一个或者多个进程组组成的集合。

一个会话可以有一个终端,建立与控制终端连接的会话首进程被成为控制进程,一个会话的几个进程组可以分为前台进程后台进程,而这些进程组的控制终端相同也就是sesion id是一样的当用户使用ctr +c 产生SIGINT信号时内核会发送信号给相应前台进程组的所有进程

如果我运行一个程序我们想要把他放到后台运行我们可以在可执行程序的后面加一个&
举个例子:./test &
如果我们想要把他提到前台进程我们可以使用fg.

1.3 守护进程的概念

守护进程也叫做精灵进程,是运行在后台的一种特殊进程他独立于控制终端并且可以周期性的执行某种任务或者等待处理某些发生的事件。

守护进程是非常有用的进程,在Linux当中大多数服务器用的就是守护进程,比如Web服务器、http等,同时守护进程完成很多系统的任务。

当Linux系统启动的时候,会启动很多系统服务,这些进程服务是没有终端的。也就是说你把终端关闭了这些系统服务是不会停止,他们一直运行着他们有一个名字就叫做守护进程

我们可以使用ps ajx来查看系统中的进程

  • 参数说明:
a代表不仅列出当前用户的进程并且其他用户的进程也会被列出
x表示不仅列出所有控制终端的进程也列出所有无控制终端的进程
j表示列出也作业控制相关的进程

下面我们使用ps axj来查看系统中的守护进程:

其中TTY为?号的都表示这个进程和终端没有关系。

在这里插入图片描述

1.4 守护线程的特点

守护进程是一种长期运行的进程,这种进程在后台运行并且不根任何控制终端关联其主要特点如下:

生存周期长[不是必须]:一般是操作系统启动的时候他启动,操作系统关闭的时候他也关闭.

守护进程和终端没有关联,也就是说他们没有控制终端,所以你控制终端退出也不会导致守护进程退出.

守护进程是在后台运行不会占着终端,终端可以执行其它命令.

1.5 守护进程创建的基本步骤

  1. 设置权限掩码,调用umask(0)权限掩码不会对文件的权限有太多的影响。

  2. 父进程创建子进程,fork一个子进程(脱离终端)出来。然后父进程退出(把终端空出来不让中端卡住):固定套路。

    • 其中fork()的目的是想调用setsid()来建立新会话。目的是子进程有单独的sid,而且子进程也成为了一个新进程组的组长,同时子进程不关联任何终端。
    • 注意:调用setsid建立新会话的进程不能是进程组的组长。
  3. 由于守护进程和终端没有关系,所以我们需要将子进程的标准输入和标准输出重定向到dev/null(空设备当中去)。

    • 我们可以使用open函数打开这个空设备文件将子进程的标准输入和标准输出重定向到这个空设备对应的文件当中。
    • 黑洞确保守护进程不从键盘接收任何东西也把任何东西打印到屏幕上。

1.6 本项目守护进程的实现

  1. 判断启动参数,若为daemon则按照守护进程启动
  2. 启动守护进程时,创建子进程用于游戏业务;父进程用于接收子进程退出状态并重启子进程
void daemonlize()
{
	//1 fork
	int ipid = fork();
	if (0 > ipid)
	{
		exit(-1);
	}
	if (0 < ipid)
	{
		//2 父进程退出
		exit(0);
	}
	
	//3 子进程 设置回话ID
	setsid();
	//4 子进程 设置执行路径

	//5 子进程 重定向3个文件描述到/dev/null
	int nullfd = open("/dev/null", O_RDWR);
	if (nullfd >= 0)
	{
		dup2(nullfd, 0);
		dup2(nullfd, 1);
		dup2(nullfd, 2);
		close(nullfd);
	}
}

int main()
{
	daemonlize();

	random_name.LoadFile();
	return 0;
}

2 进程监控

在这里插入图片描述

2.1 进程监控的实现

//进程监控
	while (1)
	{
		int pid = fork();
		if (0 > pid) // 这里是pid小于0
		{
			exit(-1);
		}

		/*父进程等子进程退出*/
		if (0 < pid)//pid大于0,是父进程
		{
			int iStatus = 0;
			wait(&iStatus);
			if (0 == iStatus)
			{
				exit(0);
			}
		}
		/*子进程跳出循环执行游戏业务*/
		else // 否则就是子进程
		{
			break;
		}
	}

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

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

相关文章

【Git】Git 学习笔记_操作远程仓库

1. SSH 配置和克隆仓库 ssh-keygen -t rsa -C "xxxqq.com"回车后出现以下内容&#xff0c;直接回车&#xff1a; Generating public/private rsa key pair. Enter file in which to save the key (/Users/your_user_directory/.ssh/id_rsa): (按回车键) Enter pass…

摆脱千篇一律!一文说透如何快速管理超低温冰箱

超低温冰箱在当今的科学、医疗和工业领域扮演着至关重要的角色&#xff0c;它们被广泛用于储存生物样本、疫苗、药品和实验物品等高价值、温度敏感的产品。 然而&#xff0c;为了维持这种稳定的温度环境&#xff0c;必须采取有效的监控和控制措施&#xff0c;因为即使短暂的温度…

嵌入式养成计划-48----QT--信息管理系统:百川仓储管理

一百二十二、信息管理系统&#xff1a;百川仓储管理 122.1 UI界面 122.2 思路 客户端&#xff1a; 用户权限有两种类型&#xff0c;一种是用户权限&#xff0c;一种是管理员权限&#xff0c;登录时服务器端会根据数据库查询到的此用户名的权限返回不同的结果&#xff0c;客户…

[HCTF 2018]WarmUp最详细解释

查看源码找到提示 访问source.php 代码审计&#xff1a; class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php"]; 定义了一个名为emmm的类&#xff0c;在该类中有…

[unity]切换天空盒

序 unity是自带天空盒的&#xff1a; 但有的时候不想用自带的。怎么自定义&#xff1f;如何设置&#xff1f; 官方文档 Unity - Manual: The Lighting window (unity3d.com) 相关窗口的打开方法 天空盒对应的选项 实际操作 从标准材质球到天空盒材质球 新建一个材质球&…

每日一题 2609. 最长平衡子字符串(简单)

乍一看&#xff0c;简单题&#xff0c;思路也很简单&#xff0c;但代码有点不好写 思路无非就是从找到的第一个 ‘0’ 开始&#xff0c;一直找 ‘0’ 知道遇到一个 ‘1’&#xff0c;此时变换策略&#xff0c;一直找 ‘1’&#xff0c;知道遇到一个 ‘0’&#xff0c;就这样一…

掌握 Figma 的自动布局,轻松设计 - 简化指南!

Figma作为一种基于浏览器操作的设计工具&#xff0c;改变了传统的设计软件工作模式&#xff0c;为我们在线合作设计奠定了基础。自推出以来&#xff0c;Figma的创新一直受到国内外众多UI设计师的关注&#xff0c;包括在推动设计团队开展高效设计工作方面&#xff0c;Figma推出了…

计算机毕业设计基于springboot+java+vue的健身房课程预约信息网站

运行环境 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven 项目介绍 本健身网…

win10安装.net3.5

运行 winver 对应Windows的版本下载相应的iso&#xff0c;可以在MSDN, 我告诉你 - 做一个安静的工具站 (itellyou.cn)下载&#xff0c;最新的去微软官方下载下载 Windows 10 (microsoft.com) 下载这个工具下载 将iso中的文件夹sxs里的内容拷贝到C:/windows/sxs里 管理员运行po…

超简单超实用的网页视频下载方法

想必大家经常需要下载网页视频&#xff0c;以便自己离线观看&#xff0c;这篇文章就来说一种超简单超实用的快捷方法&#xff0c;无需下载软件&#xff0c;无需使用插件&#xff0c;三四步轻松搞定&#xff01; 目录 Google浏览器网页视频下载 Microsoft Edge浏览器网页视频…

前端项目导入vue和element

1.安装nodejs 下载链接https://cdn.npmmirror.com/binaries/node/v18.18.0/node-v18.18.0-x64.msi 进入cmd 命令行模式 管理员身份运行 输入 &#xff08;node -v&#xff09;能看到版本号 npm config set prefix "C:\Program Files\nodejs" 默认路径 npm config…

网页【CSS】滚动条

前言 优化后的滚动条会提亮我们的网站页面。 例如&#xff1a;CSS-TRICKS这个网站如果采用的是浏览器默认的滚动条&#xff0c;不进行优化&#xff0c;页面会显得很不搭。 所以该网站的滚动条样式优化如下&#xff1a; html::-webkit-scrollbar {width: 30px;height: 30px; …

基于Springboot的时装购物系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的时装购物系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

notepad++搜索结果窗口不见了

1、使用notepad打开一个文件文件 2、ctrlf&#xff0c;打开搜索窗口&#xff0c;随便搜索一个内容 3、按F7,然后AltF7 切换焦点到Find result. 会有一个小窗口出现&#xff0c;内容是&#xff1a;还原&#xff0c;移动&#xff0c;大小等 4&#xff0c;点移动&#xff0c;使…

打造高效的客服体系,就在于这个“专属链接”

想要追踪特定数据&#xff0c;但是得在数据库中大海捞针&#xff1f; 想要知道某个推广的效果&#xff0c;但是无法追踪&#xff1f; 想要获得个性化的报告&#xff0c;但是数据不够精准&#xff1f; 面对这些情况&#xff0c;只需要靠一条“专属链接”就能一一击破&#xff…

WebGL的技术难点分析

WebGL是一项强大的技术&#xff0c;但在开发过程中可能会遇到一些挑战和技术难点。以下是一些与WebGL相关的技术难点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.3D数学和图形编程&#xff1a;理…

数据可视化PCA与t-SNE

PCA&#xff08;主成分分析&#xff09;和t-SNE&#xff08;t分布随机近邻嵌入&#xff09;都是降维技术&#xff0c;可以用于数据的可视化和特征提取。 降维&#xff1a;把数据或特征的维数降低&#xff0c;其基本作用包括&#xff1a; 提高样本密度&#xff0c;以及使基于欧…

将idea默认折叠的注释打开

idea默认的代码注释是折叠的&#xff0c;不方便查看 下面是改成默认打开的步骤 1、打开settings 2、找到Code Folding,将 Annotations前面的 对钩去掉&#xff0c;保存即可

【C++初阶(五)类和对象(上)】

本专栏内容为&#xff1a;C学习专栏&#xff0c;分为初阶和进阶两部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握C。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&…