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

news/2024/10/23 5:34:12/

文章目录

  • 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 forkint ipid = fork();if (0 > ipid){exit(-1);}if (0 < ipid){//2 父进程退出exit(0);}//3 子进程 设置回话IDsetsid();//4 子进程 设置执行路径//5 子进程 重定向3个文件描述到/dev/nullint 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.ppmy.cn/news/1204102.html

相关文章

AR眼镜硬件解决方案_AR/VR智能眼镜安卓主板芯片方案介绍

随着近两年来增强现实(AR)技术的逐渐成熟&#xff0c;采用MT8788芯片解决方案的AR眼镜已经问世。众所周知&#xff0c;AR技术可以帮助开发者打造一个既强大而又实用的混合现实世界&#xff0c;将虚拟与真实世界相结合。 据了解&#xff0c;MT8788芯片采用了多芯片分布式处理系统…

腾讯广告RACE曝光归因模型

今天我们以腾讯广告RACE曝光归因模型为例&#xff08;以下简称RACE模型&#xff09;&#xff0c;来聊聊行业在衡量广告效果上的努力与成效。 第一类&#xff1a;衡量转化以及转化过程的归因 如同前面所讲&#xff0c;如果只是衡量ROI&#xff0c;对广告投放的效果衡量就只有一…

Redis Desktop Manager安装和使用

Redis Desktop Manager&#xff08;RDM&#xff09;是一款用于管理和操作Redis数据库的图形化界面工具。提供了简单易用的界面&#xff0c;使用户能够方便地执行各种Redis数据库操作&#xff0c;并且支持多个Redis服务器的连接RDM功能介绍&#xff1a;1.连接管理&#xff1a;RD…

BP神经网络的数据分类——语音特征信号分类

大家好&#xff0c;我是带我去滑雪&#xff01; BP神经网络&#xff0c;也称为反向传播神经网络&#xff0c;是一种常用于分类和回归任务的人工神经网络&#xff08;ANN&#xff09;类型。它是一种前馈神经网络&#xff0c;通常包括输入层、一个或多个隐藏层和输出层。BP神经网…

Lavarel异步队列的使用

系统为window 启动队列&#xff1a; php artisan queue:listen设置队列类 .env文件需设置&#xff1a;QUEUE_CONNECTIONredis <?phpnamespace App\Jobs;use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Disp…

基于Java+SpringBoot+Mybaties-plus+Vue+ElementUI 失物招领小程序 设计与实现

一.项目介绍 失物招领小程序 用户登录、忘记密码、退出系统 发布失物 和 发布招领 查看我发布的失物和招领信息 失捡物品模块可以查看和搜索所有用户发布的信息。 二.环境需要 1.运行环境&#xff1a;java jdk1.8 2.ide环境&#xff1a;IDEA、Eclipse、Myeclipse都可以&#…

雷神学习---视音频数据处理入门:RGB、YUV像素数据处理

原文地址&#xff1a;https://blog.csdn.net/leixiaohua1020/article/details/50534150 ​​​​​​​​从代码可以看出&#xff0c;如果想把YUV格式像素数据变成灰度图像&#xff0c;只需要将U、V分量设置成128即可。 这是因为U、V是图像中的经过偏置处理的色度分量。色度分…

软件开发中常见的设计原则

软件开发中常见的设计原则 1. 单一责任原则2. 开放封闭原则3. 里氏替换原则4. 接口分离原则5. 依赖倒置原则6. 迪米特法则7. 合成复用原则8. 共同封闭原则9. 稳定抽象原则10. 稳定依赖原则 简写全拼中文翻译SRPThe Single Responsibility Principle单一责任原则OCPThe Open Clo…