Linux——守护进程

在这篇文章中我介绍了关于tcp网络套接字,关于网络套接字编程的问题我会再次讲述一点东西,然后介绍关于守护进程的知识。

1. 关于网络套接字编程的一些问题

在进行套接字编程时我们一定是得先有套接字,并且我们在使用socket的一些接口时,通常需要将套接字转化为网络序列:
在这里插入图片描述
但是我们在进行网络数据的传输的时候,例如在tcp协议下,我们使用的接口是read/write,那么为什么不需要把通过这些IO接口获取到的数据也进行转化为网络序列或者本地序列呢?这是因为关于网络IO的这些接口内部就已经做了网络序列和本地序列的转化了。
还有一点,我的前几篇关于网络博客中提到过udp协议是面向数据报的,tcp协议是面向字节流的,这一点该如何进行简单的体会呢?
我们在使用udp协议进行网络IO时,使用的接口是sendto/recvfrom,它的特点是我们在使用sendto发送数据之后,必须得等对面使用recvfrom接收之后我们才能继续使用sendto发消息,我们能明显地感觉到数据和数据之间是有边界的。
但是在tcp协议中,我们发现我们的客户端可以向socket文件中进行多次写入,而服务端可以一下子就把这一堆数据给读走了,这就好像你拿容器接水流一样,你并不知道即将到来的水流有多少,但是你可以停住它们(不读取),你用碗接它就是一碗水,你用杯子接它就是一杯子水,数据与数据见没有明显的边界,读端读的次数是和写端写的次数是无关的,这就是面向字节流的简单理解。

2. 守护进程

a. 守护进程的引入

我在上面链接的关于tcp网络套接字编程的文章中,介绍了一个在网络中提供简单服务的服务端程序,在现实生活中我们的服务器(这里就指服务程序)是部署在Linux上的,并且一直运行永不退出,但是在我写的那份代码中,我们的服务端程序是从命令行启动的,这就会导致当我们用户退出之后,用户对应的终端也就关闭了,与之对应的里面的进程也都关闭了,这显然不符合一款服务器的特点,那么为了我们的程序在运行起来之后能够保证不受用户的退出影响的话,我们就要把我们跑起来的服务程序变成守护进程。

b. 进程组、作业、会话

在正式认识守护进程前我们首先要认识一些其他名词,进程组,作业和会话。
我们在shell命令行中运行这样一个命令:
在这里插入图片描述
然后再查看这个进程相关的信息,我们可以看到进程id,可以看到它的父进程的id,这个父进程的id毫无疑问是bash命令行解释器。但是还有一些属性,那就是PGID(组ID),SID(会话ID),也就是说我们的额进程关系中不仅有父子,兄弟还有组的概念,我们看到在我们运行的这个进程的进程属性中它的组ID是它自己,也就是说这个进程是自称进程组的。而它的会话ID是它的父进程的ID也就是bash。说明这个进程是在这个bash所对应的会话中的。
我们再来运行一段程序:
在这里插入图片描述
我们通过管道在命令行中一起运行了三个程序,这三个进程的pid分别是44、45、46,但是它们的组ID都是44,这里我们就要提一点:一起启动的进程共同构成一个进程组,这个进程组中又以第一个启动的进程ID为它们的组ID。进程组是默认一定在一个会话中的,那我们就得认识一下什么是会话。
会话是Linux上的一个独有的概念,每次我们在登录Linux的时候,操作系统都会给我们的登录用户提供一个终端和一个bash,它俩负责给用户提供命令行解析工作,而这个中端和bash共同构成一个会话,而在当前会话命令行中启动的进程都是默认属于该会话内部的一个进程组:
在这里插入图片描述
在一个会话中,可以存在很多进程组,但是只允许一个进程组在前台进行。
因为前台会占用终端资源和键盘资源,在一个会话中这两个往往是只有一份的。
并且处在用户登录的会话中的所有进程组会随着用户的注销而退出。
而我们的服务器是永不退出的,那么它就不应该受用户的登录和注销所影响,所以我们需要将我们的服务进程变为守护进程。

c. 守护进程

话不多说我们直接来看可以将一个进程守护化的系统调用:
在这里插入图片描述
它会创建出一个新的会话,然后将这个进程置入到这个会话中,并且自成进程组,这样这个进程就不受用户的登录和注销所影响了,但是我们看到它还有一个前提:那就是被调用的这个进程不能成为进程组的组长,这里的处理方式就是创建子进程,让子进程执行后续的代码,同时子进程调用这个系统调用,而父进程直接退出,这样调用该系统调用的进程就不是进程组的组长了。
这一点也是将一个进程守护化最重要的一步。
接下来我们来编写一个将进程守护化的代码:
在这里插入图片描述

这就是将一个进程守护化的全部过程,其中重定向的null文件是Linux中的一个字符设备文件,它规定一切写入它的内容都会变成空的,从它里面读取内容也是空的:
在这里插入图片描述
我们也建议将守护进程的标准输入输出以及标准错误重定向到这个文件而不建议关闭它们。
当然系统中也提供了直接将进程守护化的系统调用:
在这里插入图片描述
但是在大部分场景中,关于守护进程需要忽略哪些信号等等操作是视情况而定的,所以我们还是一般使用自定义的守护进程化的接口。
我们现在来试一下这个守护进程:
在这里插入图片描述
在这里插入图片描述
我们看到该进程的父进程是操作系统,并且自成进程组,且与终端无关。这就是守护进程。
当我们退出shell之后再次登录:
在这里插入图片描述
它仍然在运行。

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

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

相关文章

阳哥推荐的人力RPO蓝海项目怎么做才会赚钱吗?

近年来,随着互联网的快速发展,人力资源行业也迎来了新的变革。抖音上的阳哥推荐的人力RPO(招聘流程外包)蓝海项目,因其高效、便捷的特点受到了广泛关注。那么,这个项目究竟怎么做才能赚钱呢? 首先,我们需要了解人力RP…

aws云靶场和一些杂记

aws靶场 在AWS靶场中,存在三个安全问题:1) 一个S3存储桶政策配置错误,允许公共访问,通过访问特定域名可获取flag。2) SQS消息队列的政策没有限制角色,允许发送和接收消息,通过aws sqs命令行工具的receive-…

超光速传输:有源DWDM的无限可能✊

🗺🗺随着5G时代的到来,支持更高数据速率、较低延迟和更大传输容量的网络设施大量铺设,满足了人们对高质量通信的现有要求。然而,传统光网络中通常每个业务通过多根光纤进行传输,大大降低了传输效率。为了解…

cesium JulianDate和北京时间转换

关于cesium中时间可参考: cesium Clock JulianDate 日照分析 修改当前时间为北京时间-CSDN博客 有几个概念需要了解一下。 1、GMT、UTC GMT是前世界标准时,UTC是现世界标准时,UTC 比 GMT更精准,不需要精确到秒的情况下&#xf…

太阳能智能语音卡口:环保与智能的完美结合/恒峰智慧科技

随着科技的飞速发展,我们的生活正在经历前所未有的变革。在这场变革中,太阳能智能语音卡口以其独特的魅力,成为环保与智能的完美结合,为我们的生活带来了更多的便捷和环保。 太阳能智能语音卡口,顾名思义,是…

【每日刷题】技巧合集-LC136、LC169

1. LC136.只出现一次的数字 题目链接 解法一: 先给数字排序,如果num[i]与nums[i-1]或nums[i1]都不一致,则返回nums[i]。 class Solution {public int singleNumber(int[] nums) {if (nums.length 1){return nums[0];}Arrays.sort(nums);fo…

基于LabVIEW的CAN通信系统开发案例

基于LabVIEW的CAN通信系统开发案例 介绍了基于LabVIEW开发的CAN通信系统,该系统主要用于汽车行业的数据监控与分析。通过对CAN通信协议的有效应用,实现了车辆控制系统的高效信息交换与实时数据处理,从而提升了车辆性能的检测与优化能力。 项…

Nginx内存池相关源码剖析(一)总览

剖析nginx的内存池源码,讲解原理实现以及该内存池设计的应用场景 介绍 Nginx内存池是Nginx为了优化内存管理而引入的一种机制。在Nginx中,每个层级(如模板、TCP连接、HTTP请求等)都会创建一个内存池进行内存管理。当这些层级的…

手动实现简易版RPC(下)

手动实现简易版RPC(下) 前言 什么是RPC?它的原理是什么?它有什么特点?如果让你实现一个RPC框架,你会如何是实现?带着这些问题,开始今天的学习。 接上一篇博客 手动实现简易版RPC(上&#xff…

【YOLOv9】完胜V8的SOTA模型Yolov9(论文阅读笔记)

官方论文地址: 论文地址点击即可跳转 官方代码地址: GitCode - 开发者的代码家园 官方代码地址点击即可跳转 1 总述 当输入数据经过各层的特征提取和变换的时候,都会丢失一定的信息。针对这一问题: 论文中提出的可编程梯度信息…

MATLAB实现遗传算法优化BP神经网络预测数值(GABP)

遗传算法(Genetic Algorithm, GA)和反向传播(Back Propagation, BP)神经网络是两种强大的算法,分别用于优化和机器学习。将遗传算法与BP神经网络结合,可以利用遗传算法的全局搜索能力来优化BP神经网络的初始…

Socket 通信机制详解

Socket 是网络编程中一种重要的通信机制,它允许不同的计算机通过网络进行数据交换。 一、 Socket 的概念 Socket(套接字)是计算机网络编程中的一种抽象,它提供了在网络上进行通信的接口。 Socket 本质上是一种通信的端点&#…

C++ ─── 类和对象(上)

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 3.1 类的成员函数两种定义方式: 4.类的访问限定符及封装 4.1 访问限定符 4.2 封装 5.类的作用域 6.类的实例化 7.类对象模型 7.1 如何计算类对象的大小 7.2 结构体内存对齐规则 8.this指针 …

CSS display属性

目录 概述: 设置display示例: none: block: inline: inline-block : 概述: 在CSS中我们可以使用display属性来控制元素的布局,我们可以通过display来设置元素的类型。 在不设置…

IO-序列化流

简介 这个流是为了传输对象而生的对象序列化:把java对象写入到文件中对象反序列化:把文件中的对象读出来 继承体系 ObjectInputStream:把文件中的对象读出来ObjectOutputStream:把java对象写入到文件中 常用API 示例 实体类必须实现序列化接口这其实就是…

【Excel2LaTeX】复杂表格制作的解决方案

刚开始用LaTeX写论文,遇到的第一道坎就是绘制表格,较小的普通表格可以通过简单的语法实现,但是较大的复杂的表格却让我无从下手。 Excel2LaTeX插件 这里介绍一种我用到非常顺手的工具:Excel2LaTeX插件,下载地址&#x…

C语言 【函数】

1.函数概述 函数是一种可重用的代码块&#xff0c;用于执行特定任务或完成特定功能 函数作用&#xff1a;对具备相同逻辑的代码进行封装&#xff0c;提高代码的编写效率&#xff0c;实现对代码的重用 2. 函数的使用 2.1 无参无返回值 #include <stdio.h>// 函数名…

AWS Key disabler:AWS IAM用户访问密钥安全保护工具

关于AWS Key disabler AWS Key disabler是一款功能强大的AWS IAM用户访问密钥安全保护工具&#xff0c;该工具可以通过设置一个时间定量来禁用AWS IAM用户访问密钥&#xff0c;以此来降低旧访问密钥所带来的安全风险。 工具运行流程 AWS Key disabler本质上是一个Lambda函数&…

Methoxy PEG Propionic acid具有良好的亲水性和分子量可控性

【试剂详情】 英文名称 mPEG-PA&#xff0c;mPEG-Propionic acid&#xff0c; Methoxy PEG PA&#xff0c; Methoxy PEG Propionic acid 中文名称 聚乙二醇单甲醚丙酸&#xff0c; 甲氧基-聚乙二醇-丙酸 外观性状 由分子量决定&#xff0c;固体或者液体 分子量 400&…

在Postgres中,如何有效地管理大型数据库的大小和增长

文章目录 一、定期清理和维护1. VACUUM和ANALYZE2. 删除旧数据和归档 二、分区表三、压缩数据四、配置优化1. 调整维护工作负载2. 监控和日志 五、使用外部存储和扩展1. 外部表和FDW2. 扩展和插件 六、定期备份和恢复测试结论 管理大型数据库的大小和增长是数据库管理员&#x…