Linux网络编程——守护进程

文章目录

    • 1. 前台 & 后台进程
    • 2. Linux进程之间的关系
    • 3. 守护进程

本章Gitee仓库:守护进程

1. 前台 & 后台进程

在Linux系统登陆的时候,它会给我们形成一次会话,会话在系统里面会创建一个bash进程,这个bash就会给用户提供命令行服务。

**在一个会话里面,只能存在一个前台进程,但可以有多个后台进程。**键盘信号只能发给前台进程。

GIF 2024-2-17 12-53-38

当我们直接运行程序的时候,系统就会自动把bash调到后台,然后把我们的程序调到前台,所以我们程序执行的时候,输入一些指令就没有翻译,当我们终止我们的进程的时候,此时没有前台进程,所以操作系统会将bash又重新调回前台。

如果加上&选项,就是让程序以后台进程的形式运行,此时输入一些指令就可以执行

GIF 2024-2-17 12-56-27

不管是前台还是后台进程,都可以向显示器输出内容,这就会影响到我们输入一些指令,所以我们可以采取重定向的方式,让后台进程将内容输出要一个文本里面。

所以显示器并不是区分前台和后台的一个重要指标,而是谁拥有标准输入(键盘文件),谁就是前台

启动一个后台进程时,会显示一个后台任务号

image-20240217130632303

这个后面跟的一串数字就是进程的pid

如果要查看所有的后台进程,采用指令jobs

image-20240217130733061

我们可以直接用kill命令杀掉这个后台进程,当然也可以用fg 后台任务号将这个后台进程调到前台来,然后采用ctrl + c终止

image-20240217130943019

如果又想将这个任务放回后台,ctrl + z

image-20240217131926596

当这个进程被暂停了,那么bash就又会被调到前台,但此时这个进程在后台是处于暂停状态的,采用指令bg 后台进程任务号,可重新将这个进程启动起来

image-20240217132202704

2. Linux进程之间的关系

这里单独创建了一个后台进程和连续创建了三个后台进程:

image-20240217133236068

这里单独创建的进程,自成一组;而用管道建立起的进程,它们几个是同一个组,组长是第一个创建的

image-20240217133742903

任务和进程组的关系:

任务是具体要完成的事情,而这个事情是有谁来完成,是可以指定的,可以一个进程独立完成,也可以一个进程组协同完成

所以这里可以稍微纠正一下前面的内容,一般叫做前台任务和后台任务

这里的会话ID和这些进程的父进程ID是一样的,这个就是ID就是bashpid

当关闭当前会话时,这些后台进程就会被系统回收或者是直接被杀掉,也就是说,这些后台进程是受当前会话影响的

Windows中,我们的注销,就可以理解为关闭当前会话,这里会杀掉我们打开的进程:

image-20240217140205810

如果想让进程不受会话影响,我们就需要将这个进程守护进程化

3. 守护进程

如果将一个进程(组)自称会话,也就是不需要和键盘显示器进行关联,这个就叫做守护进程

image-20240217140615269

#include <unistd.h>
pid_t setsid(void);

image-20240217152749720

这里要形成的新会话不能说这个进程组的组长,但如果这个进程组只有一个进程,那么就需要创建子进程了

所以守护进程的本质,也是孤儿进程

守护进程之后,按理说也不应该占用标准输入输出及错误,如果直接将标准输入输出错位关闭,这就需要对原来的代码进行改动。

在系统中存在一个/dev/null

image-20240217161831463

它就相当于一个垃圾桶一样,向这里面写的内容全部会自动丢弃

大部分情况下都是将日志写入文件而不是向显示屏输出,因为这样方便排查信息

守护进程代码Daemon.hpp

#include<iostream>
#include<unistd.h>
#include<signal.h>
#include<string>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>const std::string nullfile = "/dev/null";void Daemon(const std::string &cwd = "")
{//忽略常见异常信号signal(SIGCLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);signal(SIGSTOP, SIG_IGN);//核心 变成独立会话if(fork() > 0)  exit(0);setsid();//更改工作目录if(!cwd.empty())    chdir(cwd.c_str());//重定向标准输入 输出 错位 >> /dev/nullint fd = open(nullfile.c_str(), O_RDWR);if(fd > 0){dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);}
}

以之前写的翻译服务器为例,要想守护进程化,可以在main函数初始化之后加上这个功能:

int main(int argc, char *argv[])
{if(argc != 2){Usage(argv[0]);exit(USAGE_ERR);}uint16_t port = std::stoi(argv[1]);std::unique_ptr<TcpServer> tcpSvr(new TcpServer(port));tcpSvr->Init();Daemon();tcpSvr->Start();return 0;
}

也可也直接在启动的时候守护进程:

void Start()
{Daemon();signal(SIGPIPE, SIG_IGN);threadPool<Task>::GetInstance()->Start();//signal(SIGCHLD, SIG_IGN);  //直接忽略进程等待 V2log(Info, "server is running...");while(true){//...}

我们能远程登录linux,这是因为系统里面会默认起一个服务,我们每次登录就会发起一个会话:

image-20240217164044217

守护进程名字一般以d结尾

image-20240217164656439

服务端以日志形式记录:

image-20240217202318092

在系统当中有一个daemon函数,这样就不用我们自己写了(但一般情况下都是自己写):

image-20240217202431753

3号手册,是C的库函数

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

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

相关文章

Java 抽象容器类源码剖析

总体介绍 抽象容器类接口和具体容器类的关系如图所示&#xff0c;顶层包括Collection、List、Set、Queue、Deque和Map6个抽象容器类。 AbstractCollection&#xff1a;实现了Collection接口&#xff0c;被抽象类AbstractList、AbstractSet、AbstractQueue继承&#xff0c;Arra…

7.1 Qt 中输入行与按钮

目录 前言&#xff1a; 技能&#xff1a; 内容&#xff1a; 参考&#xff1a; 前言&#xff1a; line edit 与pushbotton的一点联动 当输入行有内容时&#xff0c;按钮才能使用&#xff0c;并能读出输入行的内容 技能&#xff1a; pushButton->setEnabled(false) 按钮不…

166基于matlab的通过峭度指标与互相关系数筛选IMF进行SVD分解去噪

基于matlab的通过峭度指标与互相关系数筛选IMF进行SVD分解去噪&#xff0c;分辨虚假imf&#xff0c;提取最大峭度imf图。输出去噪前后时域及其包络谱结果。程序已调通&#xff0c;可直接运行。 166 matlab SVD去噪 IMF筛选 包络谱 (xiaohongshu.com)

Android安卓架构MVC、MVP、MVVM模式的概念与区别

目录 MVC框架 MVP框架 MVVM框架 MVVM与MVP区别 MVVM与MVC区别 MVC、MVP、MVVM模式哪个要好一些 MVC&#xff08;Model-View-Controller&#xff09;、MVP&#xff08;Model-View-Presenter&#xff09;、MVVM&#xff08;Model-View-ViewModel&#xff09;是三种常见的软…

Json格式文件

1.把Java对象转换成Json格式 1.1.导入依赖 这里推荐一个插件Jackson&#xff0c;其提供的类可以让Java的类转换成Jason格式文件 <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><vers…

Camtasia2023破解版下载

Camtasia2023破解版是一款简单好用的屏幕录像软件&#xff0c;它结屏幕录制和录制视频编辑等功能于一身&#xff0c;不管是用来创建视频教程还是相关教学视频或者操作演示等都是不二的选择&#xff0c;软件支持录制全屏或者部分区域进行选择录制&#xff0c;可录制网络摄像头、…

安卓实现简单砸地鼠游戏

效果 布局 <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"a…

Muse专业版教程:制作简谱,制作吉他谱

UP教你制作吉他谱,muse专业版吉他谱制作过程分享_哔哩哔哩_bilibili教学讲解-小宁视频制作-狂奔的琴弦软件-Muse专业版后面会分集录从零开始制作吉他谱,感兴趣的小伙伴点一波关注, 视频播放量 15457、弹幕量 1、点赞数 208、投硬币枚数 127、收藏人数 424、转发人数 59, 视频…

DNS服务正反解析

1.正向解析 1.配置基本 1.1防火墙配置 二者都要关闭 setenforce 0 systemctl stop firewalld #关闭防火墙 yum install bind -y #下载bind软件 客户端可以不用下 1.2服务端配置静态ip&#xff0c; ip a 查看网卡 nmcli c modify ens33 ipv4.method manual ipv4.addresses …

OpenAI发布Sora模型,可根据文字生成逼真AI视频

早在2022年11月30日&#xff0c;OpenAI第一次发布人工智能聊天机器人ChatGPT&#xff0c;随后在全世界掀起了人工智能狂潮&#xff0c;颠覆了一个又一个行业。在过去的一年多的时间里&#xff0c;chatGPT的强大功能改变了越来越多人的工作和生活方式&#xff0c;成为了世界上用…

Python教程(26)——Python迭代器和生成器详解

迭代器 Python中的迭代器是一种对象&#xff0c;它可以迭代&#xff08;遍历&#xff09;一个可迭代对象&#xff08;比如列表、元组或字符串&#xff09;的元素。迭代器用于实现迭代器协议&#xff0c;即包含 __iter__() 方法和 __next__() 方法。 迭代器的工作原理是每次调…

数据的力量:构筑现代大型网站之数据库基础与应用

目录 数据库基础知识--前言 大型网站架构特点 DBA数据库管理员 什么是数据? 数据存储 什么是数据库 数据表的概念 为什么需要mysql这样的数据库管理工具&#xff1f;★ DBMS 收费数据库与免费数据库 运维和数据库 开发与运维的不同阶段 数据库类别 数据库具体应用…

【机器学习笔记】11 支持向量机

支 持 向 量 机 &#xff08; Support Vector Machine,SVM &#xff09; 支 持 向 量 机 是 一 类 按 监 督 学 习 &#xff08; supervisedlearning&#xff09;方式对数据进行二元分类的广义线性分类器&#xff08;generalized linear classifier&#xff09;&#xff0c;其…

C#安装CommunityToolkit.Mvvm依赖

这里需要有一定C#基础&#xff0c; 首先找到右边的解决方案&#xff0c;右键依赖项 然后选择nuget管理 这里给大家扩展一下nuget的国内源&#xff08;https://nuget.cdn.azure.cn/v3/index.json&#xff09; 然后搜自己想要的依赖性&#xff0c;比如CommunityToolkit.Mvvm 再点…

Linux超详细笔记

文章目录 Linux学习笔记操作系统Linux初识Linux的诞生Linux内核Linux发行版 虚拟机VMware安装远程连接Linux系统FinalShellFinalShell连接Linux WSL配置UbuntuLinux常用命令1.入门2.ls命令cd命令3.pwd命令4.相对路径和绝对路径5.mkdir命令6.文件操作命令&#xff08;1&#xff…

vue打包优化,webpack的8大配置方案

vue-cli 生成的项目通常集成Webpack &#xff0c;在打包的时候&#xff0c;需要webpack来做一些事情。这里我们希望它可以压缩代码体积&#xff0c;提高运行效率。 文章目录 &#xff08;1&#xff09;代码压缩&#xff1a;&#xff08;2&#xff09;图片压缩&#xff1a;&…

17.3.2.9 像素处理与内存处理之比较

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 通过第17.3.2.1节到第17.3.2.8节&#xff0c;相信读者对通过锁定内存来处理图像有了一定认识。与第17.3.1节相比较&#xff0c;可以…

程序的控制结构详解

程序的控制结构 结构化程序设计方法的基础 在计算机刚出现的早期&#xff0c;它的价格昂贵、内存很小、速度慢。程序员为了在很小的内存中解决大量的科学计算问题&#xff0c;并为了节省昂贵的CPU机时费&#xff0c;不得不使用巧妙的手段和技术&#xff0c;手工编写各种高效的…

【python】网络爬虫与信息提取--正则表达式

一、正则表达式 正则表达式是用来简洁表达一组字符串的表达式。是通用的字符串表达框架&#xff0c;简洁表达一组字符串的表达式&#xff0c;针对字符串表达“简洁”和“特征”思想的工具&#xff0c;判断某字符串的特征归属。 用处&#xff1a;表达文本类型的特征&#xff1b;…

永久禁止windows自动更新方法

文章目录 前言一、打开本地组策略编辑器二、禁用windows更新总结 前言 每次打开电脑&#xff0c;右下角就会弹出设备更新提示&#xff0c;看着令人烦恼&#xff0c;并且更新可能导致电脑设置发生改变甚至是卡顿&#xff0c;所以为了自己方便于是出了禁用电脑更新的办法&#x…