进程间关系与守护进程
个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创进程间关系与守护进程
收录于专栏[Linux学习]
本专栏旨在分享学习Linux的一点学习笔记,欢迎大家在评论区交流讨论💌
目录
1. 进程组
什么是进程组
组长进程
2. 会话
什么是会话
如何创建会话
会话 ID(SID)
3. 控制终端
4. 作业控制
什么是作业和作业控制?
作业号
作业状态
作业的挂起与切回
作业挂起
作业切回
查看后台执行或挂起的作业
作业控制相关的信号
5. 守护进程
1. 进程组
什么是进程组
之前我们提到了进程的概念,其实每一个进程除了有一个进程 ID(PID)之外,还属于一个进程组。进程组是一个或者多个进程的集合,一个进程组可以包含多个进程。每一个进程组也是有唯一的进程组 ID(PGID),并且这个 PGID 类似于进程 ID,同样是一个正整数,可以存放在 pid_t 数据类型中。
-e:选项表示 every 的意思,表示输出每一个进程信息
-o:选项以逗号操作符(,)作为定界符,可以指定要输出的列
组长进程
每一个进程组都有一个组长进程。组长进程的 ID 等于其进程 ID。我们可以通过 ps 命令看到组长进程的现象:
从结果上看 ps 进程的 PID 和 PGID 相同,那就是说明 ps 进程是该进程组的组长进程,该进程包括 ps 和 cat 两个进程。
进程组组长的作用:进程组长可以创建一个进程组或者创建该组中的进程
进程组的声明周期:从进程组创建开始到其中最有一个进程离开为止。
注意:某个进程中有一个进程存在,则该进程组就存在,这与其组长进程是否已经终止无关。
2. 会话
什么是会话
刚刚我们谈到了进程组的概念,那么会话又是什么呢?会话其实和进程组息息相关,会话可以看成是一个或多个进程组的集合,一个会话可以包含多个进程。每一个会话也有一个会话 ID(SID)
通常我们都是使用 管道 将几个进程编程一个进程组。如上如所示进程组2和进程组3可能是由下列命令形成的:
proc2 | proc3 &
proc4 | proc5 | proc6 &
我们举一个例子观察一下这个现象:
a 选项表示不仅当前用户的进程,也列出所有其他用户的进程
x 选项表示不仅列出有控制终端的进程,也列出所有无控制终端的进程
j 选项表示列出与作业控制相关的信息,作业控制后续再说
grep 的 -v 选项表示反向过滤,即不过滤带有 grep 字段相关的进程
从上述结果来看 3 个进程对应的 PGID 相同,即属于同一个进程组。
如何创建会话
可以调用 setseid 函数创建一个会话,前提是调用进程不能是一个进程的组长。
#include <unistd.h>
功能:创建会话
返回值:创建成功返回 SID,失败返回-1
pid_t setsid(void);
该接口调用之后会发生:
1. 调用进程会变成新会话的会话首进程。此时,新会话只有唯一的一个进程
2. 调用进程会变成进程组组长。新进程组 ID 就是当前调用进程 ID
3. 该进程没有控制终端。如果在调用 setsid 之前该进程存在控制终端,则调用之后会切断联系
需要注意的是:这个接口如果调用进程是进程组组长,则会报错,为了避免这种情况,我们通常的使用方法是先调用 fork 创建子进程,父进程终止,子进程继续执行,因为子进程会继承父进程的进程组 ID,而进程 ID 则是新分配的,就不会出现错误的情况。
会话 ID(SID)
上边我们提到了会话 ID,那么会话 ID 是什么呢?我们可以先说一下会话首进程,会话首进程是具有唯一进程 ID 的单个进程,那么我们可以将会话首进程的 ID 当做是会话 ID。注意:会话 ID 在有些地方也被称为 会话首进程的进程组 ID,因为会话首进程总是一个进程组的组长进程,所以两者是等价的。
3. 控制终端
先说一下什么是控制终端?
在 UNIX 系统中,用户通过终端登录系统后得到一个 Shell 进程,这个终端称为 Shell 进程的控制终端。控制终端是保存在 PCB 中的信息,我们知道 fork 进程会复制 PCB 中的信息,因此 Shell 进程启动的其他进程的控制终端也是这个终端。 默认情况下没有重定向,每个进程的标准输入、标准输出和标准错误都指向控制终端,进程从标准输入读也就是读用户的键盘输入,进程往标准输出或标准错误输出写也就是输出到显示器上。另外会话、进程组以及控制终端还有一些其他的关系,我们在下边详细介绍:
一个会话可以有一个控制终端,通常会话首进程打开一个终端(终端设备或伪终端设备)后,该终端就成为该会话的控制终端。
建立与控制终端连接的会话首进程被称为控制进程。
一个会话中的几个进程组可以分成一个前台进程组以及一个或者多个后台进程组。
如果一个会话有一个控制终端,则它有一个前台进程组,会话中的其他进程组则为后台进程组的所有进程。
如果终端接口检测到调制解调器(或网络)已经断开,则将挂断的信号发送给这些特性的关系如下图所示:
4. 作业控制
什么是作业和作业控制?
作业是针对用户来讲,用户完成某项任务而启动的进程,一个作业既可以只包含一个进程,也可以包含多个进程,进程之间互相协作完成任务,通常是一个进程管道。
Shell 分前后台控制的不是进程而是作业 或者进程组。一个前台作业可以由多个进程组成。一个后台作业也可以由多个进程组成,Shell 可以同时运行一个前台作业和任意多个后台作业,这称为作业控制
例如下列命令就是一个作业,它包括两个命令,在执行时 Shell 将在前台启动由两个进程组成的作业:
cat /etc/filesystems | head -n 5
作业号
放在后台执行的程序或命令称为后台命令,可以在命令的后面加上 & 符号从而让 Shell 识别这是一个后台命令,后台命令不用等待该命令执行完成,就可立即接收新的命令,另外后台进程执行完后会返回一个作业号以及一个进程号(PID)。
例如 下面的命令在后台启动了一个作业,该作业由两个进程组成,两个进程都在后台运行:
cat /etc/filesystems | grep ext &
执行结果如下:
[1] 2202ext4ext3ext2# 按下回车[1]+ 完成 cat /etc/filesystems | grep --color=auto ext
第一行表示作业和进程 ID,可以看到作业号是 1,进程 ID 是2022
第 3-4 行表示该程序运行的结果,过滤 /etc/filesystems 有关 ext 的内容
第 6 行分别表示作业号、默认作业、作业状态以及所执行的命令
关于默认作业:对于一个用户来说,只能有一个默认作业(+),同时也只能有一个即将成为默认作业的作业(-),当默认作业退出后,该作业会成为默认作业。
+:表示该作业号是默认作业
-:表示该作业即将成为默认作业
无符号:表示其他作业
作业状态
常见的作业状态如下表所示:
作业的挂起与切回
作业挂起
我们在执行某个作业时,可以通过 ctrl + z 键将该作业挂起,然后 Shell 会显示相关的作业号、状态以及所执行的命令信息。
例如我们运行一个死循环的程序、通过 ctrl + Z 将该作业挂起,观察一个对应的作业状态:
#include <stdio.h>int main()
{while(1){printf("hello\n");}return 0;
}
可以发现通过 ctrl + z 将作业挂起,该作业状态已经变为了停止状态
作业切回
如果想将挂起的作业切回,可以通过 fg 命令,fg 后面可以跟作业号或作业的命令名称。如果参数缺省则会默认将作业号为 1 的作业切到前台来执行,若当前系统只有一个作业在后台进行,则可以直接使用 fg 命令不带参数直接切回。具体的参数参考如下:
参数 | 含义 |
---|---|
%n | n为正整数,表示作业号 |
%string | 以字符串开头的命令所对应的作业 |
%?string | 包含字符串的命令所对应的作业 |
%+或%% | 最近提交的一个作业 |
%- | 倒数第二个提交的作业 |
例如我们把刚刚挂起来的 ./test 作业切回到前台:
运行结果为开始无限循环打印 hello,可以发现该作业已经切换到前台了。
注意:当通过 fg 命令切回作业时,若没有指定作业参数,此时会将默认作业切到前台执行,即带有 “*” 的作业号的作业
查看后台执行或挂起的作业
我们可以直接通过输入 jobs 命令查看本用户当前后台执行或挂起的作业
参数 -1 则显示作业的详细信息
参数 -p 则只显示作业的 PID
例如,我们先在后台及前台运行两个作业,并将前台作业挂起,来用 jobs 命令查看作业相关的信息:
作业控制相关的信号
上面我们提到了键入 ctrl + z 可以将前台作业挂起,实际上是将 STGTSTP 信号发送至前台进程组作业中的所有进程,后台进程组中的作业不受影响。在 unix 系统中,存在 3 个特殊字符可以使得终端驱动程序产生信号,并将信号发送至前台进程组作业,它们分别是 :
crtl + C :中断字符,会产生 SIGINT 信号
ctrl + \ :退出字符,会产生 SIGQUIT 信号
ctrl + z :挂起字符,会产生 STGSTP 信号
终端的 I/O (即标准输入和标准输出)和终端产生的信号总是从前台进程组作业连接打破实际终端。
5. 守护进程
#include <iostream>
#include <cstdlib>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>const char* root = "/";
const char* dev_null = "/dev/null";void Daemon(bool ischdir,bool isclose)
{//1. 忽略可能引起程序员异常退出的信号signal(SIGCHLD,SIG_IGN);signal(SIGPIPE,SIG_IGN);//2. 让自己不要成为组长if(fork > 0)exit(0);//3. 设置让自己成为一个新的会话,后面的代码其实是子进程在走setsid();//4. 每一个进程都有自己的 CWD,是否将当前进程的 CWD 更改成为 /根目录if(ischdir)chdir(root);//5. 已经变成守护进程啦,不需要和用户的输入输出,错误进行关联if(isclose){close(0);close(1);close(2);}else {// 这里一般建议就用这种int fd = open(dev_null,O_RDWR);if(fd > 0){dup2(fd,0);dup2(fd,1);dup2(fd,2);close(fd);}}
}
这个 Daemon 函数的目的是将一个程序转化为守护进程。它完成了一下几个步骤:
1. 忽略一些信号,防止进程异常退出
2. 使用 fork 确保父进程退出,使子进程成为孤儿进程。
3. 使用 setsid 创建新的会话,并使进程不再与终端相关。
4. 可选地将当前工作目录更改为根目录 / ,避免占用启动目录。
5. 关闭或重定向标准输入输出,确保守护进程不再与终端交互
通过这些步骤,程序就能以守护进程的方式在后台运行,不再依赖用户终端或任何终端的交互。
相关文章:
进程间关系与守护进程
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 进程间关系与守护进程 收录于专栏[Linux学习] 本专栏旨在分享学习Linux的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. 进程组 什…...
C++设计模式:组合模式(公司架构案例)
组合模式是一种非常有用的设计模式,用于解决**“部分-整体”**问题。它允许我们用树形结构来表示对象的层次结构,并且让客户端可以统一地操作单个对象和组合对象。 组合模式的核心思想 什么是组合模式? 组合模式的目的是将对象组织成树形结…...
ubuntu 安装docker
Step1:更新系统软件包 sudo apt update Step2:安装依赖包【用于通过HTTPS来获取仓库】 sudo apt install apt-transport-https ca-certificates curl software-properties-common Step3:添加Docker官方GPG密钥 sudo -i curl -fsSL https://…...
PSDK的编译与ROS包封装
本文档讲述在NIVIDIA开发板上使用大疆提供的Payload SDK获取无人机实时GPS信息的方法,以及基于Payload SDK发布ROS GPS话题信息的方法。 文章目录 0 实现目标1 Payload SDK1.1 PSDK 源码的编译1.2 PSDK 的使用 2 遥测数据的读取2.1 示例代码结构2.2 读取机载GPS信息…...
【工作流】工作顺序
背景 当时的情况是:没有产品经理,后端直接和需求方对接;前端只能短时间投入大部分时间要忙别的;只有3个角色:需求方,后端,前端; 当时直接执行的 直接使用会议了解需求,…...
Unity2021.3.16f1可以正常打开,但是Unity2017.3.0f3却常常打开闪退或者Unity2017编辑器运行起来就闪退掉
遇到问题: 从今年开始,不知道咋回事,电脑上的Unity2017像是变了个人似得,突然特别爱闪退掉,有时候还次次闪退,真是让人无语,一直以来我都怀疑是不是电脑上安装了什么别的软件了,导致…...
Java基础面试题20:Java语言sendRedirect()和forward()方法有什么区别?
Java基础面试题:Java语言sendRedirect()和forward()方法有什么区别? 在 Java Web 开发中,sendRedirect() 和 forward() 是两个非常常用的方法,但它们有一些核心区别。我们来用最简单的方式给你解释清楚。 一、sendRedirect() 和 …...
2、光同步数字传送网的特点
同步复用 光同步数字传送网(SDH)采用同步复用方式。它将多个低速信号复用成高速信号,与准同步数字体系(PDH)的异步复用不同。在 SDH 中,各支路信号与复用后的高速信号是同步的,这种同步复用的方…...
3.4 stm32系列:定时器(PWM、定时中断)
一、定时器概述 1.1 软件定时原理 使用纯软件(CPU死等)的方式实现定时(延时)功能; 不精准的延迟: /* 微秒级延迟函数* 不精准* stm32存在压出栈过程需要消耗时间* 存在流水线,执行时间不确定…...
【环境搭建】Python、PyTorch与cuda的版本对应表
一个愿意伫立在巨人肩膀上的农民...... 在深度学习的世界里,选择合适的工具版本是项目成功的关键。CUDA、PyTorch和Python作为深度学习的三大支柱,它们的版本匹配问题不容忽视。错误的版本组合可能导致兼容性问题、性能下降甚至项目失败。因此࿰…...
【经验总结】AUTOSAR架构下基于TJA1145收发器偶发通信丢失不可恢复问题分析
目录 前言 正文 1.问题描述 2.尝试问题复现 3.尝试问题定位 4.直接原因 5.总结 前言 在《【CAN通信】TJA1145收发器重要功能介绍》一文中我们详细介绍了TJA1145收发器的重点内容,最近在开发测试过程中就遇到了一个CAN通信丢失且不可恢复的偶发问题,解决该问题的思路和…...
帝国CMS:如何去掉帝国CMS登录界面的认证码登录
如果在安装的时候,不小心选中了认证码选项,那么后面登录帝国后台都会要求输入认证码才能登录,如何去除这个设置呢,笔者以古诗词网 www.gushichi.com为例,为大家举例说明! 去除步骤如下: 1.前往…...
CTF入门:单主机渗透——flag_XEE的常规思路
学习通过技术手段获取目标主机中预置的5个flag值。 在kali操作机中打开终端,然后使用nmap工具对目标机器进行端口扫描: nmap -sT 192.168.12.26 访问80端口。 网站首页是一个登录框,在界面上有一个提示的标签“弱口令”,说…...
Note2024122303_Code2Docu插件使用
Note2024122303_Code2Docu插件初使用V1.0 step1: 安装 跳转链接 文档阅读:下载文档阅读。 根据文档内容,大概知道首先下载并安装插件: 资料说明和安装方式: 意思是: 下载文件后直接运行 Code2Docu_Installati…...
深度学习之目标检测篇——残差网络与FPN结合
特征金字塔多尺度融合特征金字塔的网络原理 这里是基于resnet网络与Fpn做的结合,主要把resnet中的特征层利用FPN的思想一起结合,实现resnet_fpn。增强目标检测backone的有效性。代码实现如下: import torch from torch import Tensor from c…...
共模电感的工作原理
共模电感也称为共模扼流线圈,是一种抑制共模干扰的器件,它是由两个尺寸相同,匝数相同的线圈对称地绕制在同一个铁氧体环形磁芯上,形成的一个四端器件。当共模电流流过共模电感时,磁芯上的两个线圈产生的磁通相互叠加&a…...
mysql高阶语句
mysql高阶语句 1.对结果排序 SELECT id,name,score FROM info; #由于对id设置了主键约束,默认排序按id的大小升序排序 select name,score from info order by score; #默认按升序(从小到大排序) select name,score from info order by score…...
sfnt-pingpong -测试网络性能和延迟的工具
sfnt-pingpong 是一个用于测试网络性能和延迟的工具,通常用于测量不同网络环境下的数据包传输性能、吞吐量、延迟等指标。 它通常是基于某种网络协议(如 TCP)执行“ping-pong”式的测试,即客户端和服务器之间相互发送数据包&…...
PostgreSQL 的历史
title: PostgreSQL 的历史 date: 2024/12/23 updated: 2024/12/23 author: cmdragon excerpt: PostgreSQL 是一款功能强大且广泛使用的开源关系型数据库管理系统。其历史可以追溯到1986年,当时由加州大学伯克利分校的一个研究团队开发。文章将深入探讨 PostgreSQL 的起源、…...
【express-generator】01-安装和基本使用
创建和初始化项目 安装 npm i -g express-generator 创建一个express应用程序 //express 文件名 express blog_demo 跟着提示 cd blog_demo //移动到该目录下 npm install //初始化 npm start //启动服务 在页面打开localhost:3000(默认启动的端口)…...
20241230 基础数学-线性代数-(1)求解特征值(numpy, scipy)
所有代码实现,基于教程中的理论通过python实现出来的。效率不高,但有代码可以看。 由于scipy/sckitlearn/sparkx 底层的实现都被封装了(小白兔水平有限,fortran代码实在没看懂)这里的实现至少可以和理论公式对应的上。…...
无人零售 4G 工业无线路由器赋能自助贩卖机高效运营
工业4G路由器为运营商赋予 “千里眼”,实现对贩卖机销售、库存、设备状态的远程精准监控,便于及时补货与维护;凭借强大的数据实时传输,助力深度洞察销售趋势、优化库存、挖掘商机;还能远程升级、保障交易安全、快速处理…...
python+opencv+棋盘格实现相机标定及相对位姿估计
pythonopencv棋盘格实现相机标定及相对位姿估计 引言1,使用相机采集含棋盘格图像14张2,进行相机标定(1)测试软件1标定结果(内参及畸变系数)(2)测试软件2标定结果(内参及畸…...
【YashanDB知识库】in大量参数时查询性能慢
本文内容来自YashanDB官网,原文内容请见 https://www.yashandb.com/newsinfo/7802939.html?templateId1718516 **【标题】**in大量参数时查询性能慢 **【关键字】**in 大量参数 FAST FULL SCAN INDEX RANGE SCAN **【问题描述】**测试表数据量200w,表…...
kubevirt网络
六、KubeVirt网络 KubeVirt网络相关组件 用户在KubeVirt平台创建虚拟机只需创建一个vmi(Virtual Machine Instance)对象,之后virt-controller会根据vmi对象中的信息创建一个Pod,这里把这个Pod叫做vmi pod。Vmi pod中有kubevirt组…...
LeetCode100之腐烂的橘子(994)--Java
1.问题描述 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一: 值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单元…...
【Leetcode】855. 考场就座
文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接🔗 在考场里,有 n n n 个座位排成一行,编号为 0 0 0 到 n − 1 n - 1 n−1。 当学生进入考场后,他必须坐在离最近的人最远的座位上。如果有多个…...
AI,cursor快速上手思维导图
https://cursor101.com/zh/tutorial/learn-cursor-tab...
【演化博弈】期望收益函数公式、复制动态方程——化简功能技巧
期望化简 在演化博弈论的研究中,期望收益函数和复制动态方程是核心工具。化简这些公式的功能技巧具有以下几个重要作用: 提高公式的可读性和理解度 复杂的数学表达式可能让人感到困惑。通过化简,公式变得更加简单和易读,使研究者…...
常用Linux命令
常用Linux命令介绍 1.ls命令用于列出当前目录的内容,包括目录、文件和压缩包等。 2.ls命令的参数可以以长格式显示文件信息,如修改时间、文件大小等。 3.使用ls -a参数可以显示隐藏文件和文件夹。 4.通过ls -lh命令可以以人类可读的方式显示文件和文件夹…...
记录树莓派4B安装向日葵的过程
到向日葵官网下载向日葵 for Linux的麒麟Arm64版本;sudo dpkg -i 文件名.deb 安装;安装依赖: sudo apt install libappindicator3-1 如果没有的话就使用: sudo apt install libayatana-appindicator3-1 关闭wayvnc服务及其自启动…...
模型 课题分离
系列文章 分享 模型,了解更多👉 模型_思维模型目录。明确自我与他人责任。 1 课题分离的应用 1.1课题分离在心理治疗中的应用案例:李晓的故事 李晓,一位28岁的软件工程师,在北京打拼。他面临着工作、家庭和感情的多重…...
docker部署微信小程序自动构建发布和更新
通过 Jenkins 和 Docker 部署微信小程序,并实现自动构建、发布和版本更新,主要涉及以下几个步骤: 设置 Jenkins 环境配置 GitLab 与 Jenkins 的集成构建 Docker 镜像部署和发布微信小程序配置 Jenkins 自动构建 以下是详细的步骤说明&#…...
0.96寸OLED显示屏详解
我们之前讲了 LCD1602,今天我们将它的进阶模块——OLED。它接线更少,性能更强,也能显示中文和图像了。 大家在学习单片机的时候是否会遇到调试的问题呢?例如 “这串代码我到底运行成功了没有” ,我相信很多刚开始学习…...
【Python使用】嘿马python高级进阶全体系教程第10篇:静态Web服务器-返回固定页面数据,1. 开发自己的静态Web服务器【附代码文档】
本教程的知识点为:操作系统 1. 常见的操作系统 4. 小结 ls命令选项 2. 小结 mkdir和rm命令选项 1. mkdir命令选项 压缩和解压缩命令 1. 压缩格式的介绍 2. tar命令及选项的使用 3. zip和unzip命令及选项的使用 4. 小结 编辑器 vim 1. vim 的介绍 2. vim 的工作模式 …...
H3C AC_AP基本配置流程
前置摘要 AP管理地址:10.115.8.0/ AP业务地址:10.115.10.0 SSID qdtest passwd 123chery map.txt system-view vlan 1010 quit interface GigabitEthernet 1/0/1 port link-type trunk port trunk permit vlan 1010AC配置 vlan 1008 des Ap_manager quit int vlan 1008 ip ad…...
准备写一个内网穿透的工具
准备写一个内网穿透的工具,目前只实现了HTTP内网穿透的GET方式,看能不能坚持写下去 git地址: xuejiazhi/PortRelay...
模型高效微调方式
除了LoRA(Low-Rank Adaptation)外,还有其他一些快速且效果好的模型微调方法。这些方法可以在保持模型性能的同时,减少计算和存储需求。以下是几种常见的方法: 1. 参数高效微调(Parameter-Efficient Fine-T…...
Linux系统编程——理解系统内核中的信号捕获
目录 一、sigaction() 使用 信号捕捉技巧 二、可重入函数 三、volatile关键字 四、SIGCHLD信号 在信号这一篇中我们已经学习到了一种信号捕捉的调用接口:signal(),为了深入理解操作系统内核中的信号捕获机制,我们今天再来看一个接口:si…...
ISP算法之BNR降噪(Bayer域)
概述 BNR(Bayer Noise Reduction)即Bayer域降噪算法。对于噪声的分类如下表所示: 高斯噪声( Gaussian) 高斯噪声也被称为热噪声,通常是由于电路系统中自由电子的热运动,这种噪声幅度分布服从高…...
HBuilder快捷键大全
目录 一、最常用快捷键 二、文件操作快捷键 三、选择操作快捷键 四、插入操作快捷键 五、编辑操作快捷键 六、删除操作快捷键 七、查找操作快捷键 八、标签规范快捷键 八、运行操作快捷键 九、转换操作快捷键 十、跳转操作快捷键 十一、附加功能快捷键 十二、快捷键…...
Diffusion_Policy项目测试报错记录
1、项目连接 paper:2303.04137 (arxiv.org) github: real-stanford/diffusion_policy: [RSS 2023] Diffusion Policy Visuomotor Policy Learning via Action Diffusion (github.com) 2、问题与解决办法 1) 运行 python train.py --..... 显示无法Err…...
Linux内核学习资源
老版本内核源码: https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/old-versions/ 内核源码分析开源项目: https://github.com/ultraji/linux-0.12/tree/master/srchttps://gitee.com/wslyx/linux-0.12https://github.com/0voice/linux_ke…...
NGINX的安装和配置(Linux环境)
目录 NGINX 安装方式1、 离线编译安装2、 在线仓库安装 NGINX 常用命令1、进程管理命令2、信息查看命令 NGINX 配置文件1、进程使用的配置2、配置文件格式3、配置文件层级 NGINX 全局配置1、全局配置常用指令2、连接相关配置 NGINX 配置MIME1、MIME 标准2、types 配置块3、defa…...
Leetcode打卡:考场就坐
执行结果:通过 题目: 855 考场就坐 在考场里,有 n 个座位排成一行,编号为 0 到 n - 1。 当学生进入考场后,他必须坐在离最近的人最远的座位上。如果有多个这样的座位,他会坐在编号最小的座位上。(另外&am…...
STM32——“SPI Flash”
引入 在给单片机写程序的时候,有时会用到显示屏,就拿市面上的0.96寸单色显示器来说,一张全屏的图片就占用8x1281024个字节,即1kb的空间,这对于单片机来说确实有点奢侈,于是我买了一个8Mb的SPI Flash&#x…...
Zookeeper基本命令解析
ZooKeeper -server host:port -client-configuration properties-file cmd args addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE addauth scheme auth 一、整体命令格式 ZooKeeper -serve…...
React-更新state的数据,dom没有重新渲染
{entourageList.map((person) > (<Row key{person.id}> {/* 使用唯一的 person.id */}<Col span{16}><Row gutter{16}><Col lg{9} md{18} sm{24}><FormItem label{姓名}>{getFieldDecorator(name-${person.id}, {initialValue: person.name,…...
消息队列技术的发展历史
消息队列技术的演进历程宛如一幅波澜壮阔的科技画卷,历经多个标志性阶段,各阶段紧密贴合不同的技术需求与市场风向,下面为您详细道来。 第一阶段:消息中间件的起源(1970 年代末期 - 1980 年代中期) 在计算…...
20.抽卡只有金,带保底(WPF) C#
这是一个界面应用化后的抽卡,目前只能抽金,只有基础概率加保底概率 适合界面化应用初学者。 这是展示图: 使用的是WPF不是winform,我也是第一次做WPF内容,就可以试一试,代码都在这里了,简单来…...