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

文章目录

  • 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.mzph.cn/news/136076.shtml

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

相关文章

AD9371 Crossbar

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

uni-app实现扫码功能

实现扫码功能,我们需要调用uni-app的scanCode saoma(){//调用scanCode实现扫码功能uni.scanCode({//是否只能从相机扫码,不能从相册扫码onlyFromCamera:false,//规定扫码类型 字节跳动小程序不支持此参数// barcode就是一维码(条形码) qrcode就是(er)维码 // datamatrix就是…

Ubuntu18.04安装pcl-1.12.1,make时报错:/usr/bin/ld: cannot find -lvtkIOMPIImage

解决方案&#xff1a; 在vtk安装包中&#xff0c;重新打开cmake-gui&#xff0c;然后勾选上VTK_Group_MPI和VTK_Group_Imaging。 cd VTK-8.2.0 cd build cmake-gui然后重新编译生成。 make -j8 # 或者j4,量力而行。 sudo make install 就可以解决了。 然后重新回到pcl安装…

web3 从redux中拿出所有已完成订单 并渲染到对应的Table列表中

上文web3 React dapp项目通过事件从区块链中拿到 已取消 已完成 和所有的订单数据 并存入redux中 中 我们已经从 区块中拿到了自己的订单 然后 我们恢复一下上文的环境 ganache ganache -d然后 登一下 MetaMask 然后 用我们的项目 发布一下合约 truffle migrate --reset然后…

vue:写一个数组box和list数组,在保留box数组中原有对象的同时,将list数组中每一个对象插入到box数组后面

前言&#xff1a;由于源码涉及到后端调用数据和一些无关的功能所以我就专门针对这个功能的代码&#xff0c;这样好方便理解。 1、在data中定义两个数组&#xff1a;box和list&#xff0c;并给它们初始化值 data() {return {box: [/*初始的box数组对象*/],list: [/*初始的list…

k8s----27、云原生存储StorageClass、CSI、Rook

1、动态存储介绍 StorageClass:存储类,由K8s管理员创建,用于动态PV的管理,可以链接至不同的后端存储, 比如Ceph、GlusterFS等。之后对存储的请求可以指向StorageClass,然后StorageClass会自动 的创建、删除PV。 实现方式: in-tree: 内置于K8s核心代码,对于存储的管理,都…

华为OD机试 - 无重复字符的最长子串(Java JS Python C)

目录 题目描述 示例 提示 题目解析 Java算法源码 JS算法源码 Python算法源码

Win10 180天后怎么才能继续体验,自动保持续期,无需手动JH

环境: Win10 专业版 自制小程序 问题描述: Win10 180天后怎么才能继续体验,自动保持续期,无需手动JH 解决方案: 在执行本程序前需要以管理员身份运行!关闭杀毒软件,否则会失败,本方案只能在个人电脑测试体验, 只能用于学习测试体验 ,勿用与商业行为 1.先完全JH…

配置资源管理

Secret Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源&#xff0c;这类数据虽然也可以存放在 Pod 或者镜像中&#xff0c;但是放在 Secret 中是为了更方便的控制如何使用数据&#xff0c;并减少暴露的风险。 三种类型&#xff1a; kubernetes.io/service-accoun…

kubeadm安装k8s高可用集群

目录 一、环境规划&#xff1a; 二、注意事项&#xff1a; 三、环境准备&#xff1a; 1. 关闭防火墙规则&#xff0c;关闭selinux&#xff0c;关闭swap交换&#xff1a; 2. 修改主机名&#xff1a; 3. 有节点修改hosts文件&#xff1a; 4. 所有节点时间同步&#xff1a; 5. 所…

【星海出品】flask (二) request替代VUE测试flask接口

flask 是一门使用 python 编写的后端框架。 VUE前端UI装饰推荐学习Element组件库 之后就不使用UI去测试flask了,环节太多,影响直观反映,直接使用postman或request测试更加直观. url携带参数 app.route(/my/blog/<blog_id>)def blog_detail(blog_id): # put applicatio…

c++ 中 const 和static

1. static 首先使用static的主要目的是控制存储周期&#xff0c; 链接性 和可见性 可以作为 1. 局部变量 2.类成员 3. 全局变量和函数 2. const const 关键字用于声明一个变量为常量&#xff0c; 一旦初始化之后&#xff0c;它的值就不会被改变 。 2.1 常量表达式 声明为c…

CF1781F Bracket Insertion(2700*) 题解(括号匹配DP)

题目 题面 简要题意&#xff1a; 你需要执行一下步骤 n n n 次来构建括号序列&#xff1a; ⋅ \cdot ⋅ 等概率选择一个空位&#xff08;若当前有 k k k 个字符&#xff0c;则有 k 1 k 1 k1 个空位&#xff09;。 ⋅ \cdot ⋅ 以 p p p 的概率插入字符…

2023.10月考试战报|华为认证HCIP考试100%通过

相关文章&#xff1a; 考试战报|2023.7月-8月思科认证、华为认证-CSDN博客 2023.4月及5月最新HCIP 考试战报来袭_厦门微思网络的博客-CSDN博客 HCIP 3-4月考试战报_厦门微思网络的博客-CSDN博客 2023年HCIP/CCNP考试战报_厦门微思网络的博客-CSDN博客 2023年10月&#xff0…

卸载QQ后聊天记录怎么恢复?这3个有效方法送给大家!

近年来&#xff0c;微信崛起&#xff0c;已经逐渐占据了人们的日常生活&#xff0c;成为大家不可或缺的东西。这也导致了如今使用QQ的用户变得越来越少。如果用户使用QQ的频率比较低&#xff0c;那么他们可能会选择卸载QQ以此来节省手机空间。 一旦将QQ卸载&#xff0c;这意味…

集合贴3——智能客服系统

基础课17——智能客服系统-CSDN博客文章浏览阅读56次。近年来&#xff0c;实体客服机器人开始出现在银行办公厅、电信商务厅等场合&#xff0c;形成了网络智能客服、电话智能客服、实体客服机器人综合智能客服系统&#xff0c;这初步形成了一种新的产业形式。https://blog.csdn…

电汇ABC(2023-10)

目录 基本表单费用承担方式汇款人姓名(拼音)汇款人地址收款人姓名收款人账号收款人地址(及国家/地区)收款行SWIFT 代码收款行名称、地址申报信息 相关汇款时效汇出审核关于汇往境外他人账户 费用钞转汇 其他其他方式个人购汇额度美元现钞存取额度破损美元境内外币转账美元 OR 港…

强化您的应用安全,从app加固开始

强化您的应用安全&#xff0c;从app加固开始 目录 强化您的应用安全&#xff0c;从app加固开始 摘要 引言 1. 加密和数据保护 2. 代码混淆 3. 防止反编译 4. 安全测试 5. 更新和补丁 6. 权限控制 7. 输入验证和输出过滤 8. 日志记录和监控 9. 安全设计和架构 10.…

Python 函数定义详解(More on Defining Functions)- 默认参数/位置参数/关键字参数

1.函数的定义和调用方法 1.1函数定义方法 """def 关键字用来定义一个函数。function_name 是函数名&#xff0c;应遵循命名规范。parameter1, parameter2, ... 是函数的参数列表&#xff0c;可以是任意数量和类型的参数。函数体是用缩进&#xff08;通常为4个…

Cesium 相机设置

1.setView 直接跳转到目的地 // 设置相机位置 const position Cesium.Cartesian3.fromDegrees(113, 31, 20000); // setView通过定义相机目的地&#xff08;方向&#xff09;,直接跳转到目的地 viewer.camera.setView({ destination: position, // 位置设置 orientation: { //…