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.hqwc.cn/news/473544.html

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

相关文章

websocket数据帧格式

客户端、服务端数据的交换&#xff0c;离不开数据帧格式的定义。因此&#xff0c;在实际讲解数据交换之前&#xff0c;我们先来看下WebSocket的数据帧格式。 WebSocket客户端、服务端通信的最小单位是帧&#xff08;frame&#xff09;&#xff0c;由1个或多个帧组成一条完整的消…

IP地址+子网掩码+CIDR学习笔记

目录 一、IP地址 1、表示方法&#xff1a; 2、特殊IP地址 二、子网掩码 1、判断网络位和主机位 2、子网划分 三、无分类编址CIDR 1、CIDR路由汇聚 汇聚规则&#xff1a; 汇聚ID&#xff1a; 2、最佳路由匹配原则 一、IP地址 1、表示方法&#xff1a; 机器中存放的…

SQL32 截取出年龄(substring_index函数的用法)

代码 select substring_index(substring_index(profile,,,3),,,-1) as age ,count(device_id) from user_submit group by age知识点 substring_index(FIELD, sep, n)可以将字段FIELD按照sep分隔&#xff1a; (1).当n大于0时取第n个分隔符(n从1开始)之前的全部内容&#xff1…

【Linux系统化学习】文件重定向

目录 文件内核对象 文件描述符的分配规则 重定向 重定向的概念 dup2系统调用 输出重定向 追加重定向 输入重定向 stderr解析 重定向到同一个文件中 分离常规输出和错输出 文件内核对象 上篇文章中我们介绍到了操作系统中的文件&#xff0c;操作系统为了方…

基于STM32的老人心率监测系统

1. 系统设计 本次课题为基于STM32的老人心率监测系统&#xff0c;在此设计了如图2.1所示的系统结构框图&#xff0c;整个系统包括了MAX30102心率血氧检测模块&#xff0c;SIM800短信模块&#xff0c;液晶显示模块&#xff0c;按键&#xff0c;ESP8266无线通信模块以及主控制器s…

1Coze平台介绍

2023年随着OpenAI推出GPT 3.5&#xff0c;AI赛道变得更加火热。GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种自然语言处理&#xff08;NLP&#xff09;模型&#xff0c;用于生成文本、理解语言和进行各种语言任务。GPT是由OpenAI开发的&#xff0c;它…

32.3K Star,再见 Postman,这款开源 API 客户端更香

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 使用 API 工具来调试接口是后端开发经常会使用的&#xff0c;之前一直…

鸿蒙应用开发工程师招聘多吗?工资有多少呢?

随着鸿蒙操作系统的快速普及&#xff0c;越来越多的企业开始重视鸿蒙应用开发人才的培养和引进。那么&#xff0c;目前市场上鸿蒙应用开发工程师招聘多吗&#xff1f;工资有多少呢&#xff1f; 首先&#xff0c;我们来了解一下鸿蒙应用开发工程师的招聘情况。随着鸿蒙操作系统…

Code Composer Studio (CCS) - Comment (注释)

Code Composer Studio [CCS] - Comment [注释] References Add Block Comment: 选中几行代码 -> 鼠标右键 -> Source -> Add Block Comment shortcut key: Ctrl Shift / Remove Block Comment: 选中几行代码->鼠标右键->Source->Remove Block Comment s…

【Anaconda】conda创建、删除、查看虚拟环境,安装pytorch

1.删除环境 首先退出现有的环境 conda deactivate然后查看要删除的环境名称与路径 conda env list接下来就可以删除环境了 有两种方法 方法1&#xff1a; conda env remove -p 要删除的虚拟环境路径对我来说就是&#xff1a; conda env remove -p D:\Anaconda3\envs\MVDet…

牛客——IncDec Sequence(差分)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 给定一个长度为 n(n≤105)(n \leq 10^5 )(n≤105) 的数列a1,a2,…,an{a_1,a_2,…,a_n}a1​,a2​,…,an​&#xff0c;每次可以选择一个区间 [l,r]&#xff0c;使下标在这个区间内的数…

智慧校园规划建设方案

校园信息化建设呈现智能化、应用多样化发展趋势&#xff0c;多种技术和应用交叉渗透至校园生活的各个方面&#xff0c;全面的智慧校园时代已经到来。 对智慧校园的四大应用领域分析 智慧的教学 信息共享交互&#xff1a;建立信息发布、共享、传播与交互的公共平台 教学流程…