TCP socket api详解 续

文章目录

    • 守护进程
      • 怎么做到?
        • setsid
          • 返回值
      • dev/null字符文件
    • daemon
    • TCP协议

退出的时候呢?

会话有很多后台任务,bash肯定会退,那后台会话怎么办呢?
理论上也要退的,但实际上关了bash,bash肯定要退,所有进程的父进程都是bash他就自动托孤,但他们依旧属于同一个会话,所以后台会话还是在系统里被保留下来了,他是没有问题的依旧可以跑的。这写后台进程收到了用户登录和退出的影响的,因为ppid发生改变
图中后台进程关闭bash前后对比
在这里插入图片描述

在这里插入图片描述

如果我们今天不想受到任何用户登录和注销的影响—守护进程化

注销:Windows中也有类似会话,注销会把会话关闭,前后台会话都关闭,再重启就不卡了。

守护进程

我们要把后台进程转化为
自成进程组+自成会话的进程 --守护进程
在这里插入图片描述
所以和曾经打开的bash会话中从包含关系变成并列关系,此时你爱怎么样怎么样和我无关,不再受用户登录和注销的影响了。

怎么做到?

setsid

创建一个会话,谁调用这个setsid就把进程的组ID 设置为会话的id
相当于让一个进程独立成会话
在这里插入图片描述

返回值

成功返回新的会话ID,一般都是调用进程的pid,否则-1被返回

函数特点:你要创建新会话,调用进程不能是进程组的组长。
组长是多个进程中的第一个
在这里插入图片描述
但是组员可以
基本进程本身自己就是组成,自成进程组,也是组长。
那我们就没办法去调用setsid呢?
我怎么保证自己不是组长呢?
默认可执行程序启动就是组长,pid = pgid
换句话说只要我不是第一个进程,那我就一定不是组长啊。
所以创建守护进程最核心的一部就是fork,如果是父进程直接退出,子进程setsid就一定能成功了。
这其实就是守护进程最核心的点了。

所以守护进程的本质也是孤儿进程!
在这里插入图片描述
因为它的父进程直接就退了,所以守护进程立马要被系统领养,他唯一和孤儿进程不一样的是他很坚强,他把自己设置为独立的会话。就不受任何用户登录注销影响。

在这里插入图片描述
有些程序需要在根目录,所以有更改守护进程的路径选项

在这里插入图片描述
在初始化init ,启动的时候调用这个函数,进去的时候是父进程出去的时候就是子进程,以子进程的身份往后执行。

关键是后续代码有很多输出打印日志,还可能有标准输入,标准错误。
作为守护进程就不应该往显示器打印了。

所以需要关闭标准输入,标准输出,标准错误
那你往已经关闭的输出输出流打印,printf函数不都出错了吗,函数调用全都失败的。
我们决不允许出现这样的错误。
如果你能做到让日志往文件里写,那就和0,1,2就没关系,所以正常。
可是服务器里不用日志还有大量cout cerr 难道就看着他们出错吗,即便不出错,我写个守护进程还有把打印都删掉吗?

怎么样平滑的处理这个问题?

dev/null字符文件

相当于垃圾桶
在这里插入图片描述
写进这个文件的数据全部会被丢弃。

堵不如疏,不如将标准输入输出错误全部重定向至/dev/null
如果你想把日志保留,那就让日志往文件里面写。
守护进程没终端,也不会从键盘里面获取了。
谁规定守护进程打印信息必须从显示器上看,如果一个服务已经启动了,这个服务的错误消息不应该在显示器上读,因为他必须把自己的日志信息写到文件里。

打开这个dev/null 文件 把三个流重定向到这个文件中,这个文件后面也不用了就关了,因为文件描述符表已经重定向完成了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
ls /proc/pid -l 内存级进程可视化

在这里插入图片描述
ls /proc/4945/fd -l 这不文件描述符表吗哈哈,不过是内存级的所以会闪动,磁盘上没有对应的镜像文件,345是客户端来连我的
在这里插入图片描述
那守护进程怎么关呢,直接kill

为什么我们能用shell来访问云服务呢?
因为系统里默认有一个22号服务也就是ssh
在这里插入图片描述
在这里插入图片描述
shell向sshd -D发起请求,经过网络执行再把结果返回
一般进程如果是守护进程 名字应该以d结尾

难道要让我自己搞这个守护进程吗,有没有好点的做法,不要让我自己写,系统有没有默认的呢?

daemon

在这里插入图片描述
默认参数0,0就可以了,和我们的deamon一样

TCP协议

在这里插入图片描述
无论三次握手,四次挥手,代码层面感知不到,断开连接你也看不到你只是调close
应用层只是调用connect 发起一次握手,等connect返回就可以了,返回之前双方系统会自动进行三次协商,握手成功至此建立连接成功,握手成功之后调用accept,调用期间没有三次握手没有连接,那么accept就要阻塞,只要三次握手成功了accept才会返回,accept返回之后其实是把底层完成三次握手的连接拿上来,至此我们就获取了一个新的连接,这个连接用新的文件描述符来表征。
第二个呢我们在通信的时候双方都要close关闭不需要的文件描述符,一个关闭一个确认,调一次close会触发两次挥手。相当于我给对方发消息,对方说好的。这叫做两次挥手,连起来就是4次挥手。
在这里插入图片描述
三次握手四次挥手如何去理解
三次握手相当于TCP可靠性的一种,他在正式通信前先要三次握手把双方的连接维护好,连接建立好之后,后面你调用的read,write 其实就是基于这个连接来数据通信的
在这里插入图片描述
你在学校里,突然发现一个女孩就是我要的白月光朱砂痣,人家也看到了你,你呢要么高帅,你俩对眼了,男生跑过去就和人家说,做我女朋友吧,这是你给对方发的,人家就回你说,好呀,什么时候开始呢?你说,就现在。
至此我们就以最小的沟通成本,顺利的就有了男朋友女朋友。这叫做三次握手。

确定男女朋友关系,后面正常吃饭自习见家长,可是和你处了一段时间,你这货又不上课天天打游戏,脾气还大不思进取,女孩觉得你不太适合她。
女孩就和你说,我们分手吧,你一听你就来气,我付出了那么多,你说好的。
当然也有舔狗同学不和女生分手,你为什么要和我分手?一直给女方发消息,女孩就是不给你回,单向通信的信道已经关闭,你可以给她发,但是这种不太好。
在这里插入图片描述
单方面分手是分不了的,必须征得双方的同意,比如结婚是需要离婚的。

所以我们分手吧,你说好的,同意分手。
你跟我分手了对不对,我也要跟你分手,对方说好的。
至此双方明确表明了双方意见,并且互相征得对方的同意
这就叫做协商分手成功。
断开连接是双方的事情,所以四次挥手。
建立连接一定是一方主动(connect)发起三次握手。

在这里插入图片描述
TCP通信时全双工的
你再给我发消息时我也可以给你发消息,这两件事情可以同时进行。
TCP是如何做到全双工通信的呢?
TCP底层会提供发送缓冲区,接收缓冲区,一旦创建好了网络套接字,在OS内部针对特定文件描述符,OS给上层就用的sockfd进行读写时,OS就会给你读写缓冲区。
你在用TCP的时候,别人也在用TCP

客户端是一对缓冲区,服务端也是有的。
在这里插入图片描述
当我们在网络通信时,你自己也定义了上层缓冲区一个读的一个写的,所以你现在想发消息的时候,通过文件描述符把上层缓冲区数据拷贝到发送缓冲区,然后发送缓冲区会把数据通过网络交给对方的接受缓冲区,所以对方就能读到接受缓冲区的数据了,
在这里插入图片描述
因为TCP是既有接受又有发送。所以意味着使用这个文件描述符进行发送的时候,对方也可以使用他的缓冲区把数据通过文件描述符拷贝到自己的发送缓冲区,把数据通过网络拷贝到你的接受缓冲区,再交给上层缓冲区。
在这里插入图片描述
说明实际通信时,TCP为什么能做到全双工呢?
因为他的接受和发送缓冲区是独立的,对双方也一样,所以多线程对同一个fd进行读写时,他是不会互相影响的,因为资源是隔离的。
也就是未来对于fd我既可以创建多线程对他读也可以对他写,因为资源底层是分离的,对方也是分离的。

read/write这样的接口本质是一种拷贝函数
把用户缓冲区数据拷贝到发送缓冲区,或者把内核数据拷贝到用户缓冲区。

缓冲区的数据什么时候发,发多少,出错了怎么办,完全由TCP自主决定。
所以把TCP叫做传输控制协议,控制在网络发送时发送主动权由TCP来决定。

所以服务器端客户端可以连我,服务器端可不可以收到来自很多客户的链接呢或者正在保持很多链接?
如何理解连接?
那么有这么多连接,OS要不要管理这些连接呢?要管理,先描述在组织。
所以三次握手成功之后,双发需要在各自内核里创建连接结构体,所以有了链接结构体,我们的OS,所谓的接受发送缓冲区就可以认为在连接结构体里的。最后每一个连接,一个连接结构体对象,一百个连接就100个连接结构体对象,所以把100个结构体对象用链表连接起来,对连接的管理转化成了对链表的增删查改。
在这里插入图片描述

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

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

相关文章

06_数据类型

数据类型 数据类型分类 JavaScript 语言的每一个值,都属于某一种数据类型。JavaScript 的数据类型,共有六种。(ES6 又新增了第七种 Symbol 类型的值和第八种 BigInt类型,当前课程暂不涉及) 据类型分类 原始类型(基础类型) var age = 20, var name = 尚学堂"; var le…

scrapy豆瓣爬虫增强-批量随机请求头

1.1 豆瓣爬虫增强,中间件随机请求头 1.2 清除原有的中间件,进行中间件测试 1.3 导入全新的中间件 1.4 运行爬虫,这个时候的请求头是固定的 1.5 强化对agent的输出,会舍弃输出cookie,使输出更明了 1.6 转移输出请求头位置 新增输出 造成这样问题的原因是Douban/Douban/settings…

非关系型数据库有哪些特点?

非关系型数据库(NoSQL)具有以下主要特点‌:‌1 ‌灵活的数据存储方式‌:非关系型数据库不采用传统的基于表格的数据存储方式,而是采用更加灵活的数据存储方式。它可以存储各种类型的数据,包括文本、图像、音…

智慧防汛平台在城市生命线安全建设中的应用

随着城市化进程的加快,城市基础设施的复杂性和互联性不断增强,城市生命线的安全管理面临前所未有的挑战。智慧防汛平台作为城市生命线安全建设的重要组成部分,通过现代信息技术提升城市防汛应急管理的智能化水平,保障城市安全。 …

【ChatGPT大模型开发调用】如何获得 OpenAl API Key?

如何获取 OpenAI API Key 获取 OpenAI API Key 主要有以下三种途径: OpenAI 官方平台 (推荐): 开发者用户可以直接在 OpenAI 官方网站 (platform.openai.com) 注册并申请 API Key。 通常,您可以在账户设置或开发者平台的相关页面找到申请入口。 Azure…

vue3 发送 axios 请求时没有接受到响应数据

<script setup> import Edit from ./components/Edit.vue import axios from axios import { onMounted,ref } from vue// TODO: 列表渲染 //装数据的列表 const list ref([]) const count ref(0) const getList async () > {//通过发送 /list 请求从后端拿到列表数…

衡山派D133EBS 开发环境安装及SDK编译烧写镜像烧录

1.创建新文件夹&#xff0c;用来存放SDK包&#xff08;其实本质就是路径要对就ok了&#xff09;&#xff0c;右键鼠标通过Open Git Bash here来打开git 输入命令 git clone --depth1 https://gitee.com/lcsc/luban-lite.git 来拉取&#xff0c;如下所示&#xff1a;&#xff0…

关于Vscode配置Unity环境时的一些报错问题(持续更新)

第一种报错&#xff1a; 下载net请求超时&#xff08;一般都会超时很正常的&#xff09; 实际时并不需要解决&#xff0c;它对你的项目毫无影响 第二种报错&#xff1a; .net版本不匹配 解决&#xff1a;&#xff08;由于造成问题不一样&#xff0c;所以建议都尝试一次&…

快速理解微服务中Fegin的概念

一.由来 1.在传统的架构里面&#xff0c;我们是通过使用RestTemplate来访问其他的服务&#xff0c;但是这种方式就存在了一个很大的缺陷&#xff0c;也就是被调用方如果发生了服务的迁移(IP和端口发生了变化)&#xff0c;那么调用方也需要同步的在代码里面进行修改&#xff0c;…

【网络安全 | 漏洞挖掘】绕过SAML认证获得管理员面板访问权限

未经许可,不得转载。 文章目录 什么是SAML认证?SAML是如何工作的?SAML响应结构漏洞结果什么是SAML认证? SAML(安全断言标记语言)用于单点登录(SSO)。它是一种功能,允许用户在多个服务之间切换时无需多次登录。例如,如果你已经登录了facebook.com,就不需要再次输入凭…

STM32C011开发(1)----开发板测试

STM32C011开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32C011F4P6-TSSOP20 评估套件可以使用户能够无缝评估 STM32C0 系列TSSOP20 封装的微控制器功能&#xff0c;基于 ARM Corte…

医院分诊管理系统|Java|SSM|VUE| 前后端分离

【重要1⃣️】前后端源码万字文档部署文档 【重要2⃣️】正版源码有问题包售后 【重要3⃣️】可复制品不支持退换货 【包含内容】 【一】项目提供非常完整的源码注释 【二】相关技术栈文档 【三】源码讲解视频 【其它服务】 【一】可…

Android数据存储——文件存储、SharedPreferences、SQLite、Litepal

数据存储全方案——详解持久化技术 Android系统中主要提供了3中方式用于简单地实现数据持久化功能&#xff0c;即文件存储、SharedPreference存储以及数据库存储。除了这三种方式外&#xff0c;还可以将数据保存在手机的SD卡中&#xff0c;不给使用文件、SharedPreference或者…

vue3 + vite + antdv 项目中自定义图标

前言&#xff1a; 去iconfont-阿里巴巴矢量图标库 下载自己需要的icon图标&#xff0c;下载格式为svg&#xff1b;项目中在存放静态资源的文件夹下 assets 创建一个存放svg格式的图片的文件夹。 步骤&#xff1a; 1、安装vite-plugin-svg-icons npm i vite-plugin-svg-icons …

【H2O2|全栈】Node.js(2)

目录 前言 开篇语 准备工作 npm 概念 常见指令 项目中的包 创建项目 启动项目 服务器搭建 express 基本步骤 搭建应用 创建路由 监听端口 启动服务器 面试相关 结束语 前言 开篇语 本系列博客分享Node.js的相关知识点&#xff0c;本章讲解npm与服务器的简单…

QChart数据可视化

目录 一、QChart基本介绍 1.1 QChart基本概念与用途 1.2 主要类的介绍 1.2.1 QChartView类 1.2.2 QChart类 1.2.3QAbstractSeries类 1.2.4 QAbstractAxis类 1.2.5 QLegendMarker 二、与图表交互 1. 动态绘制数据 2. 深入数据 3. 缩放和滚动 4. 鼠标悬停 三、主题 …

Harbor安装、HTTPS配置、修改端口后不可访问?

Harbor安装、HTTPS配置、修改端口后不可访问&#xff1f; 大家好&#xff0c;我是秋意零。今天分享Harbor相关内容&#xff0c;安装部分可完全参考官方文档&#xff0c;写的也比较详细。 安装Harbor 官方文档&#xff1a;https://goharbor.io/docs/2.12.0/install-config/ …

MTK 展锐 高通 sensorhub架构

一、MTK平台 MTK框架可以分为两部分&#xff0c;AP和SCP。 AP是主芯片&#xff0c;SCP是协处理器&#xff0c;他们一起工作来处理sensor数据。 SCP 是用来处理sensor和audio相关功能和其他客制化需求的一个协处理理器&#xff0c;MTK SCP选择freeRTOS作为操作系统&#xff0c…

JDK的版本演化,JDK要收费吗?

Java版本演化历史 Java的版本历史可以追溯到1995年&#xff0c;以下是Java语言自诞生以来的主要版本及其关键特性&#xff1a; 一、早期版本 Java 1.0&#xff08;1996年1月发布&#xff09; 引入了Java虚拟机&#xff08;JVM&#xff09;和Java应用编程接口&#xff08;API&…

【Code First】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列 &#x1f…