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

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

相关文章

MyBatis 源码分析 - 映射文件解析过程

1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程。由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因。所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来,独立成文,于是就有了本篇文章…

新标准日本语 课后练习

自学错误可能较多,听力题不需要听力的就没听录音 第二十課 スミスさんはピアノを弾くことができます 練習1-1 1張さんは日本の歌を歌うことができます 张先生会唱日本歌 2小野さんは自転車に乗ることがで…

设计模式代码实战-模版方法模式

1、问题描述 小明喜欢品尝不同类型的咖啡,她发现每种咖啡的制作过程有一些相同的步骤,他决定设计一个简单的咖啡制作系统,使用模板方法模式定义咖啡的制作过程。系统支持两种咖啡类型:美式咖啡(American Coffee&#…

RAID 5实训

Raid 5 配置实训 实验结构: 实验步骤 环境准备,Linux操作虚拟机下添加3个及以上的磁盘用于raid 10阵列构建所用(本次实验4个,一个用于备用)创建raid 5 磁盘阵列格式化并挂载磁盘阵列存储速度检查是否提升安全性能检查…

DevExpress WinForms中文教程 - 如何通过UI测试自动化增强应用可靠性?(二)

DevExpress WinForm拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜任…

C++进阶——继承

前言:从这篇文章开始,我们进入C进阶知识的分享,在此之前,我们需要先来回顾一个知识: C语言有三大特性,分别是封装、继承和多态,而我们前边所分享的各种容器类,迭代器等,…

数据结构----链表算法题目

1.移除链表的元素 这个题目我们有多种解决方案 (1)思路A:遍历整串数据,如果是我们想要删除的数据,就让这个数字后面的数字全部向前移动直到整传数字全部遍历完成;这个方法的时间复杂度是N的平方&#xff…

ARM作业day8

温湿度数据采集应用: 由上图可知: 控制温湿度采集模块的引脚是PF14(串行时钟线)和PF15(串行数据线):控制温湿度采集模块的总线是AHB4,通过GPIOF串口和RCC使能完成初始化操作。 控制…

MAC-OS低版本升级到高版本——亲测有效

关于MAC-OS 10.13.6 升级到10.15的实战 一.MAC 欧司如何查看他的系统版本 查看信息如图 二.,去官网下载新的MAC OS 系统 官网地址:如何下载和安装 macOS - 官方 Apple 支持 (中国) 三.点击安装 四.具体步骤可以参考官网 在兼容的 Mac 电脑上下载并安装最新或以前…

最新版idea 合并分支方法

前言 以下是最新版的idea2024,如果有人找不到按键可能是因为版本不同。 操作步骤 看右小角我的分支是submit,现在我要将test合并到我的submit分支上 找到test分支,选择update,这一步会拉取相应分支内容等同于pull 选择merge 选…

I2C,UART,SPI(STM32、51单片机)

目录 基本理论知识: 并行通信/串行通信: 异步通信/同步通信: 半双工通信/全双工通信: UART串口: I2C串口: SPI串口: I2C在单片机中的应用: 软件模拟: 51单片机:…

PHP-file_get_contents(练习1)

[题目信息]: 题目名称题目难度PHP-file_get_contents(练习1)1 [题目考点]: file_get_contents() 把整个文件读入一个字符串中。 该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增…

同城O2O系统开发实战:外卖送餐APP的技术架构与实现

今天,我们将深入探讨同城O2O系统开发实战中,外卖送餐APP的技术架构与实现。 一、概述 外卖送餐APP是一种典型的O2O应用,通过移动互联网技术,将用户与商家连接起来,实现用户在线订餐,商家配送服务的模式。…

Git分布式版本控制系统——在IDEA中使用Git(一)

一、在IDEA中配置Git 本质上还是使用的本地安装的Git软件,所以需要在IDEA中配置Git 打开IDEA的设置页面,按照下图操作 二、在IDEA中使用Git获取仓库 1、本地初始化仓库 2、从远程仓库克隆 方法一: 方法二: 三、.gitignore文件…

简单的网站-表白墙(前后端交互)

提交信息后,就得到了下面的一行话 但是存在一些问题 在一个网站中,服务器起到的最主要的效果,就是 “存储数据” 因此服务器这边往往也就需要能够提供两种风格的接口。存数据 、取数据 二、实现前后端交互 1)先规定此处请求和响…

2024-04-11最新dubbo+zookeeper下载安装,DEMO展示

dubbozookeeper下载安装 下载zookeeper: 下载地址 解压,并进入bin目录,启动 如果闪退可以编辑脚本,在指定位置加上暂停脚本 报错内容说没有conf/zoo.cfg,就复制zoo_sample.cfg重命名为zoo.cfg 再次启动脚本&#x…

前端网络 --- http缓存

什么是http缓存? 1、HTTP 缓存会存储与请求关联的响应,并将存储的响应复用于后续请求。 2、缓存的原理是在首次请求后保存一份请求资源的响应副本,当用户再次发起相同请求时,判断缓存是否命中,如果命中则将前面的响应…

react v18 项目初始化

按照以下命令进行傻瓜式操作即可: 全局安装脚手架工具: npm install -g create-react-app创建项目my-react-app: create-react-app my-react-app安装 antd: yarn add antd安装 react-router-dom: yarn add react-router-dom启动项…

图论学习总结

目录 图论学习总结前言一、基础知识图的存储图的遍历 二、最短路多源最短路 F l o y d Floyd Floyd​ 算法例题及变形 e g 1 : S o r t i n g I t A l l O u t eg1:Sorting\ It\ All\ Out eg1:Sorting It All Out ( 蓝书例题,传递…

软硬链接与动静态库

文章目录 1.软硬链接2.动态库和静态库2.1 见一见库2.2 动静态库2.2.1 静态库2.2.2 动态库 2.3 动静态库的对比 3.真实的应用场景(ncurses库)4.库加载---可执行程序和地址空间4.1可执行程序的加载4.2 库的加载 1.软硬链接 2.动态库和静态库 2.1 见一见库 我们用过很多库。C/C的…