Linux:进程信号

文章目录

  • 信号的概念
  • 实践信号
    • 关于前台和后台进程的操作
  • 操作系统与外设
  • 信号的产生

前面的篇章结束了信号量的话题,那么接下来引入的是信号的话题,信号和信号量之间没有任何关系,只是名字比较像

信号的概念

在生活中存在各种各样的信号,例如有红绿灯这样的存在,而进程信号和生活中的信号其实是比较像的,为什么有红灯停绿灯行这样的概念,其实就是因为作为人从小就被指导有这样的观念,因此对应到进程信号中,有下面的几个结论:

  1. 当信号还没有产生的时候,其实进程就已经知道如何应对这个信号了,这是操作系统在设计的时候就已经被设计好的理念,所以在内核中存在这样的设计:

在这里插入图片描述

上述的这64种信号就是在操作系统内部已经设计好的内容,当某个进程得到了这样某种信号,就会对对应的信号做出反应,就如同当人遇到绿灯会行驶,遇到红灯会停止一样的道理

  1. 信号的到来,进程并不清楚具体什么时候来,信号的到来和当前进程的逻辑是异步产生的
  2. 信号产生后,进程并不一定要立即处理它,而是在一个合适的时机进行处理,这也就意味着进程必须要对于即将来临的信号有一定的存储能力,以便于在外来需要对该信号处理的时候可以找到这个信号并进行处理

异步的概念

在第二条结论中提及到了异步的概念,因此这里对于异步进行一些解释

同步和异步是一组概念,同步概念的引出是在管道中引出的,管道的执行逻辑是具有一定的顺序性,产生顺序性的本质是让两个进程相互知道彼此的两个进程,感受到对应进程的存在,这也就是为什么管道在写端写满后,如果读端不读,写端就不会写的原因,这就是因为两个进程之间建立了一定的相关性,两个进程之间是会相互影响的,而对于异步来说,就是同步的相反点,当进程a向某个位置输出信息时,进程a没有因为其他外界的原因导致停止对于某个位置信息的输出,而是在一直输出,那么这个过程就称作是异步

信号的本质是一种向目标进程发送通知消息的一种机制

实践信号

#include <iostream>
#include <unistd.h>
using namespace std;

int main()
{
    while (true)
    {
        cout << "it is a process, pid:" << getpid() << endl;
        sleep(1);
    }
    return 0;
}

运行上述结果

在这里插入图片描述

此时会发现的现象是,运行的任何命令都没有效果,此时运行kill命令就可以对其进行终止了:

在这里插入图片描述
此时进程终止,并且以前的命令也都显示出来了

下面对上述的现象做出解释

进程在运行的过程中,通常有两种模式,一种是前台模式,运行方式是

./process

一种是后台模式,运行方式是

./process &

这是对于一个进程的两种运行方式,其中后台程序一般是执行一些耗时比较长的任务,就可以使用后台进行启动,并且不会占用前台的操作

对于Linux系统来说,前台程序执行后再进行输入命令就无效了,为什么?因为shell本身也是一个进程,如果把一个进程放到了前台,那么就相当于把shell放到了后台,shell放到了后台,自然就不能对用户的命令进行解释了,因此区分一个进程是用前台启动的还是后台启动的,就看能不能从键盘上接受用户的输入,这也是最直接的方法

关于前台和后台进程的操作

[test@VM-16-11-centos signal]$ ./process >> log1.txt &
[1] 11861
[test@VM-16-11-centos signal]$ ll
total 24
-rw-rw-r-- 1 test test  351 Jan 30 16:13 log1.txt
-rw-rw-r-- 1 test test   79 Jan 30 12:58 Makefile
-rwxrwxr-x 1 test test 9176 Jan 30 12:58 process
-rw-rw-r-- 1 test test  198 Jan 30 12:55 Process.cc
[test@VM-16-11-centos signal]$ jobs
[1]+  Running                 ./process >> log1.txt &
[test@VM-16-11-centos signal]$ fg 1
./process >> log1.txt
ll
pwd
^Z
[1]+  Stopped                 ./process >> log1.txt
[test@VM-16-11-centos signal]$ bg 1
[1]+ ./process >> log1.txt &
[test@VM-16-11-centos signal]$ jobs
[1]+  Running                 ./process >> log1.txt &

在这里插入图片描述

将一个进程从后台提到前台

fg number

将一个进程从前台放到后台,自动沉睡

ctrl+z

将一个后台程序唤醒

bg number

查看当前运行的后台进程

jobs

操作系统与外设

如果谈到进程信号,就需要引入中断的概念,但是对于中断的概念来说,更需要提及的是这样的问题

操作系统是硬件的管理者,所以硬件上的变化操作系统应该知道并且接收,例如鼠标点击了哪里,键盘按下了哪个键,这些操作系统都要知道,只有知道了键盘按下的数据,才能根据冯诺依曼体系,利用键盘驱动把键盘上的数据拷贝到操作系统中对应键盘的文件缓冲区中,上层就可以通过文件描述符把对应的数据读取上来,所以scanf就能读取到对应的数据了

问题是:操作系统怎么知道键盘被按下了?

由冯诺依曼体系可以知道,计算机结构中有输入单元,也有输出单元,有内存CPU外设这些信息,那么操作系统是如何知道外设中的数据就绪了呢?难道是让操作系统隔一段时间就去检测一下外设中的输入信息吗?结合实际生活的经验以及操作系统对于效率的控制就能知道,这是绝对不可能的,所以一定是让硬件来告诉操作系统

操作系统最初在进行设定的时候,就要求CPU和外设要取得同步,能够让CPU知道关于外设上的各种信息,所以引入了一门新的技术叫做中断技术,关于中断技术,就要先清楚CPU本身的结构,CPU内部有运算器做数据处理,也有控制器进行设备的控制,那么也就意味着CPU必定要和设备直接或间接的相连,所以CPU就会提供一个一个的针脚,这个针脚是有编号的,针脚会与电脑中的主板相连,而主板上的硬件电路是和外设相连,所以在冯诺依曼体系中,CPU之和内存进行数据交互,就是因为外设太慢了,但是实际上CPU一定是会和外设有关联的,只不过不是进行直接的数据交互,那在计算机中,主板就担任了关联的角色,在主板上有各种各样的硬件电路,这些硬件电路就和CPU上的针脚相连,换句话说,当电脑上插入一个新的外设设备后,实际上就和电脑连接完毕了,此时键盘上发送的消息,CPU就能知道,发送的信息就叫做中断信息

对于中断信息这个概念来说,中断体现在把光电信号就叫做中断,换句话说,对应在电脑中的每一个外设与CPU本身都可以进行高低电平的信息交互,外设和CPU硬件是可以间接相连的,未来也能够进行数据的拷贝,不光如此,键盘在触发的时候会产生出很多的光电信号,这些光电信号的强弱就会被CPU识别到,CPU中的各种各样的寄存器就能对这些光电信号进行识别,识别的结果其实就是说某一种数据被放到了计算机中,这样就被操作系统读取到了,这样也就把硬件的行为信息转换成了软件的信息

经过上面的这一系列过程,就把数据从硬件转换到软件了,软硬件结合的本质就是通过寄存器或者内存中的数据来进行软硬件的数据结合

关于8259板

电脑上可以插入很多的电子设备,可能是键盘网卡这样对于操作系统来说有用的硬件设备,也可能是一个普通的风扇这样,仅仅是需要供电的设备,那么操作系统对于每个这样的设备都要进行链接吗?答案是否定的,在CPU和硬件之间会有一个电路板,叫做8259板,和电脑相连的所有设备,都会通过这个电路板再传递给CPU,而这个电路板的作用就是可以把有效的信息进行转换,传递给CPU中

所以得出的一个结论是,外设可以间接的向CPU特定的针脚中发送信息,表示自己的数据已经就绪了,而CPU中每一个针脚都会有一个对应的编号,这个编号就叫做中断号,因此在计算机中,每一个设备都会分配不同的中断号,当这个设备发生中断后,就能识别到这个设备的信息已经就绪了,那CPU就能通过这些信息拿到键盘上对应的中断号,拿到中断号之后,为了能够更快的对这些外设做出响应,在操作系统的内部会提供一张表,这个表中是一个函数指针数组,存储的是一个一个的指针,而这些指针指向的内容就是特定硬件的读取方法,当外设启动的时候,就会通过这张表形成对应硬件就绪后的读取方法,当中断号传递来之后,就借助这个数组索引到需要的内容,进而读取到这个设备想要传递来的数据信息。这张表叫做中断向量表,这张表在操作系统启动的时候,就要创建出的一张表。这样就保持了操作系统高效的特点,同时也能读取到各个设备上的消息

当用户摁键盘的时候,键盘就会基于中断来进行驱动,所以就会通过硬件告知CPU,进而通过操作系统把中断号提取出来,再从中断向量表中找到对应的方法,进而就能完成执行的操作

谈了这么多问题,其实就是想引出关于中断的概念,而键盘的行为和操作系统的行为其实和信号十分类似,它们都遵循异步的逻辑,键盘怎么摁,操作系统不会专门去等着它,而是在摁完之后操作系统会在合适的时候对这个行为做出响应,那信号是不是也是类似呢?一个信号传递给进程,进程可能并不会立即做出响应,它会在完成了当前最重要的任务后,再对这个信号做出反应,这其实就是一个异步的逻辑原理,那信号中的这些各种各样的信号,是不是就如同对应的中断号,而中断向量表,不就是和kill列表中的各种信号是一样的吗?

因此得出的结论是,信号本身就是用软件来模拟中断的行为,只不过这两个操作在设计上是两套机制,一个是纯硬件,一个是软件上的操作,但是在响应和异步的方面,它们之间是有很多的相似处的

信号的产生

Ctrl+c的命令可以让前台的进程终止,那为什么呢?借助信号来解决这个问题

键盘中的数据是有很多种的,其中一种是1234这样的普通数据,一种是例如Ctrl+c这样的组合键,这样的数据被叫做是控制数据,它传递的是一种控制的思想观念,操作系统如果收到了普通数据,就把数据传递给用户进程,如果是组合键,就把这个数据转换成一种动作

所以,引出的结论是,Ctrl+c命令本质上就是一种组合键,它要传递的控制数据就是向进程发送2号信号,也就是说kill -2和Ctrl+c是等价的,具体可以通过看返回上一个命令的状态来看

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

现代C++之万能引用、完美转发、引用折叠FrancisFrancis

转载&#xff1a;现代C之万能引用、完美转发、引用折叠 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/99524127 后期参考(还未整合)&#xff1a;C 完美转发深度解析:从入门到精通_c完美转发-CSDN博客https://blog.csdn.net/qq_21438461/article/details/129938466 0.导语 …

【数据结构 05】双链表

一、原理 双链表又称双向链表&#xff0c;通常情况下是带头循环结构&#xff0c;在CSTL标准模板库中封装的<list.h>头文件就是带头双向循环链表。 特性&#xff1a;增删灵活且高效&#xff0c;支持随机增删但不支持随机访问 设计思路&#xff1a; 链表包含一个头节点h…

如何提高工业数据采集的效率和准确性-天拓四方

随着工业4.0和智能制造的兴起&#xff0c;工业数据采集的重要性日益凸显。通过数据采集&#xff0c;企业能够实时监控生产过程&#xff0c;优化资源配置&#xff0c;提高生产效率。在实时监控、生产优化、质量控制等方面&#xff0c;有效的数据采集系统能够为企业提供宝贵的洞察…

Pinely Round 2 F. Divide, XOR, and Conquer

F. Divide, XOR, and Conquer 题意 给定一个非负整数数组 a a a&#xff0c;定义操作&#xff1a; 对于区间 [ l , r ] [l,r] [l,r]&#xff0c;选择一个分界点 l ≤ k < r l \leq k < r l≤k<r&#xff0c;将其分成 [ l , k ] [l,k] [l,k] 和 [ k 1 , r ] [k…

系统架构设计师教程(十六)嵌入式系统架构设计理论与实践

嵌入式系统架构设计理论与实践 16.1 嵌入式系统概述16.1.1 嵌入式系统发展历程16.1.2 嵌人式系统硬件体系结构16.2 嵌入式系统软件架构原理与特征16.2.1 两种典型的嵌入式系统架构模式16.2.2 嵌入式操作系统16.2.3 嵌入式数据库16.2.4 嵌入式中间件16.2.5 嵌入式系统软件开发环…

[GN] 设计模式—— 创建型模式

文章目录 创建型模式单例模式 -- 确保对象唯一性例子优化饿汉式懒汉式 优缺点使用场景 简单工厂模式例子&#xff1a;优化优缺点适用场景 工厂方法模式 -- 多态工厂的实现例子优缺点优化适用场景 抽象工厂模式 -- 产品族的创建例子优缺点适用场景 总结 创建型模式 单例模式 –…

嵌入式系统设计师之任务管理

目录 一、任务划分(II) 二、任务控制块&#xff08;TCB)(II) 三、任务的状态及状态转换(II) 四、任务队列(II) 五、任务管理机制(II) 六、任务调度(II) 6.1 调度时机 6.2 调度方式 6.3 调度算法性能指标和分类 6.4 任务调度算法&#xff08;II) 1、先来…

OpenHarmony—环境准备

JS SDK安装失败处理指导 问题现象 下载JS SDK时&#xff0c;下载失败&#xff0c;提示“Install Js dependencies failed”。解决措施 JS SDK下载失败&#xff0c;一般情况下&#xff0c;主要是由于npm代理配置问题&#xff0c;或未清理npm缓存信息导致&#xff0c;可按照如…

【Docker】linux、nginx、容器镜像三者基本概念

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《Docker容器》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对…

ISCTF wp

web 圣杯战争 题目源码 <?php highlight_file(__FILE__); error_reporting(0);class artifact{public $excalibuer;public $arrow;public function __toString(){echo "为Saber选择了对的武器!<br>";return $this->excalibuer->arrow;} }class pre…

第九篇【传奇开心果系列】beeware的toga开发移动应用示例:人口普查手机应用

传奇开心果博文系列 系列博文目录beeware的toga开发移动应用示例系列博文目录一、项目目标二、安装依赖三、实现应用雏形示例代码四、扩展功能和组件的考量五、添加更多输入字段示例代码六、添加验证功能示例代码七、添加数据存储功能示例代码八、添加数据展示功能示例代码九、…

Java基于SpringBoot+Vue的电影影城管理系统,附源码,文档

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

TypeScript实战系列之合理运用类型

目录 介绍any 和 unknownerve 的用途断言type 和 interfacedeclare 关键字的作用联合类型 和 类型守卫交叉类型 介绍 这篇主要介绍下ts 常用的基本类型和一些常用的技巧性技能 any 和 unknow any 和 unknown 是两个类型关键字&#xff0c;它们用于处理类型不确定或未知的情况…

AI绘画:PhotoMaker Win11本地安装记录!

昨天介绍一个叫PhotoMaker的AI绘画开源项目。挺不错的&#xff01; 通过这个项目可以快速制作特定人脸的AI绘画作品&#xff0c;相比传统的技术效果会好很多&#xff0c;效率也高很多。 今天趁热打铁&#xff0c;本地电脑装装看&#xff0c;并且记录&#xff0c;分享一下&#…

高效摄入英语信息的独门武器

经常有读者问我&#xff1a;日常看的都是什么样的信息&#xff1f; 简单来说&#xff0c;大致是这些&#xff1a;比较前沿的科研成果&#xff0c;心理学和神经科学的最新文献&#xff0c;一些综述性和总结性的文章&#xff0c;以及跟心理、大脑和其他科学领域相关的期刊杂志&am…

数据结构—栈实现前缀表达式的计算

前缀表达式计算 过程分析 中缀表达式&#xff1a;&#xff08;1 5&#xff09;*3 > 前缀表达式&#xff1a;*153 &#xff08;可参考这篇文章&#xff1a;中缀转前缀&#xff09; 第一步&#xff1a;从右至左扫描前缀表达式&#xff08;已存放在字符数组中&#xff09;&a…

最近公共祖先

最近公共祖先 概念 给定一棵有n个节点的树&#xff0c;树中的两个节点u和v的最近公共祖先lca&#xff0c;有以下定义 &#xff08;1&#xff09;lca既是u的祖先&#xff0c;又是v的祖先 &#xff08;2&#xff09;lca是所有u和v的公共祖先中深度最深的祖先&#xff0c;也就…

Linux第38步_编译“正点原子移植好的uboot”

uboot的全称是Universal Boot Loader&#xff0c;uboot是一个遵循GPL协议的开源软件&#xff0c;uboot是一个裸机代码&#xff0c;可以看作是一个裸机综合例程。现在的 uboot 已经支持液晶屏、网络、USB等高级功能。 uboot官方的uboot源码是给所有的半导体厂商准备的。ST公司会…

CSS自适应分辨率 postcss-pxtorem(适用于 Vite)

前言 此篇是基于 Vite Vu3 项目的 CSS 自适应分辨率&#xff01; 如果想知道基于 Webpack Vue2 可移步 《CSS自适应分辨率 amfe-flexible 和 postcss-pxtorem&#xff08;适用于 Webpack&#xff09;》 项目对应的主要插件版本如下&#xff1a; "vite": "^4…

使用Win32API实现贪吃蛇小游戏

目录 C语言贪吃蛇项目 基本功能 需要的基础内容 Win32API 介绍 控制台程序部分指令 设置控制台窗口的长宽 设置控制台的名字 控制台在屏幕上的坐标位置结构体COORD 检索指定标准设备的句柄&#xff08;标准输入、标准输出或标准错误&#xff09; 光标信息结构体类型CONSOLE_CUR…