Linux:进程信号

news2024/9/24 7:18:54

文章目录

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

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

信号的概念

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

  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.coloradmin.cn/o/1420828.html

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

相关文章

【游戏服务器部署】幻兽帕鲁服务器一键部署保姆级教程,游戏私服还是自己搭建的香

在帕鲁的世界&#xff0c;你可以选择与神奇的生物「帕鲁」一同享受悠闲的生活&#xff0c;也可以投身于与偷猎者进行生死搏斗的冒险。帕鲁可以进行战斗、繁殖、协助你做农活&#xff0c;也可以为你在工厂工作。你也可以将它们进行售卖&#xff0c;或肢解后食用。—幻兽帕鲁 想要…

【Linux】压缩脚本、报警脚本

一、压缩搅拌 要求&#xff1a; 写一个脚本&#xff0c;完成如下功能 传递一个参数给脚本&#xff0c;此参数为gzip、bzip2或者xz三者之一&#xff1b; (1) 如果参数1的值为gzip&#xff0c;则使用tar和gzip归档压缩/etc目录至/backups目录中&#xff0c;并命名为/backups/etc…

【新书推荐】4.1节 数值编码规则

本节内容&#xff1a;不同进制数据的编码规则。 ■数值数据的编码规则&#xff1a;二进制数、十六进制数和十进制数&#xff0c;以及无符号整数和有符合整数的编码规则。 ■基本数据类型&#xff1a;编译器指定的数据类型为基本数据类型。汇编器MASM5.0指定的基本数据类型有BYT…

HubSpot社交媒体影响力怎么样?

HubSpot是一家在数字营销和销售领域非常知名的公司&#xff0c;以其全面的营销、销售和客户服务软件而闻名。然而&#xff0c;关于HubSpot在社交媒体上的具体影响力&#xff0c;这是一个动态的情况&#xff0c;因为社交媒体的影响力可能受到多种因素的影响&#xff0c;包括社交…

yarn 现代的包管理工具 介绍

一、前言 yarn 是一个现代的包管理工具&#xff0c;它是 npm&#xff08;Node Package Manager&#xff09;的一个替代品。yarn 由 Facebook 开发&#xff0c;并在 2016 年发布。它解决了当时 npm 的一些问题&#xff0c;尤其是在性能和安全性方面。 yarn 主要用于以下几个方面…

利用操作符解题的精彩瞬间(上)

下面是链接为了解释练习2的并且还有与操作符相关的知识。 C语言与操作符相关的经典例题-CSDN博客 操作符详解&#xff08;上&#xff09;-CSDN博客 操作符详解&#xff08;下&#xff09;-CSDN博客 目录 练习1&#xff1a;在一个整型数组中&#xff0c;只有一个数字出现一…

SpringCloud微服务常见问题

1 微服务 返回面试宝典 问题1 SpringCloud常见组件有哪些&#xff1f; SpringCloud包含的组件很多&#xff0c;有很多功能是重复的&#xff0c;其中最常见的组件包括&#xff1a; 注册中心组件&#xff1a;Eureka、Nacos等&#xff1b;负载均衡组件&#xff1a;Ribbon&…

面试题 02.07. 链表相交(力扣LeetCode)

文章目录 面试题 02.07. 链表相交题目描述解题思路c代码优化后c代码 面试题 02.07. 链表相交 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 …

【Linux】—— 信号的产生

本期&#xff0c;我们今天要将的是信号的第二个知识&#xff0c;即信号的产生。 目录 &#xff08;一&#xff09;通过终端按键产生信号 &#xff08;二&#xff09;调用系统函数向进程发信号 &#xff08;三&#xff09;由软件条件产生信号 &#xff08;四&#xff09;硬件…

【学习笔记】Vue3源码解析:第一部分-实现vue3环境搭建

课程地址&#xff1a;【已完结】全网最详细Vue3源码解析&#xff01;&#xff08;一行行带你手写Vue3源码&#xff09; 第一部分&#xff1a;实现vue3环境搭建&#xff08;对应课程的第1-3节&#xff09; VUE2与VUE3的对比&#xff1a; 也即vue2的痛点&#xff1a; 对TypeSc…

vue3前端开发框架的安全特性,非常适合现在的市场需求

vue3前端开发框架的安全特性,非常适合现在的市场需求&#xff01;现在几乎所有的前端开发&#xff0c;都是使用的vue3做了开发。下面给大家展示一下。为什么说vue3框架自带安全特性呢。 如图&#xff0c;这个是我们在浏览器内看见的&#xff0c;渲染后的数据页面信息。很齐全。…

超越人类上限的策划:百度输入法在候选词区域植入广告

一位 V2EX 用户最新发帖称&#xff0c;百度输入法的最新版本中引入了一个新功能&#xff0c;将广告直接植入到候选词区域。 具体表现为&#xff0c;当用户输入某些关键词时&#xff0c;候选词区域会显示与输入内容相关的广告链接。例如&#xff0c;用户输入“招商”时&#xf…

【C++】类与对象(二)特殊成员函数

前言 类与对象&#xff08;二&#xff09; 文章目录 一、特殊成员函数二、构造函数三、析构函数四、拷贝构造函数五、拷贝赋值运算符 一、特殊成员函数 如果在类的声明中未显式提供某个成员函数的定义&#xff0c;编译器会自动生成一个默认实现。 这包括默认构造函数、默认析构…

Flutter 开发3:创建第一个Flutter应用

Step 1: 安装Flutter 1.1 下载Flutter SDK 首先&#xff0c;你需要访问Flutter官方网站下载最新的Flutter SDK。选择适合你操作系统的安装包。 $ cd ~/development $ unzip ~/Downloads/flutter_macos_2.2.3-stable.zip1.2 更新环境变量 接下来&#xff0c;你需要将Flutter…

笔记本电脑系统Win10重装教程

当前很多用户都会使用笔记本电脑办公&#xff0c;如果笔记本电脑携带的操作系统不好用&#xff0c;就会影响到用户的办公效率&#xff0c;这时候可以给笔记本电脑重新安装一款好用的系统。以下小编带来笔记本电脑系统Win10重装教程&#xff0c;让用户们轻松给笔记本电脑重新安装…

张维迎《博弈与社会》纳什均衡与囚徒困境博弈(2)囚徒困境博弈

囚徒困境大家应该都比较熟悉了&#xff0c;我觉得这篇的意义大概在与&#xff0c;经济学术语的运用&#xff1f; 囚徒困境&#xff1a;个人理性与集体理性的矛盾 假定有两个犯罪嫌疑人共同作案。警察抓住他们以后&#xff0c;分开拘押&#xff0c;并告诉他们&#xff1a;可以选…

GWIT 和GWFI

关于燃烧的历史&#xff1a; -UL request needle flame (open fire) test to rate flammability per UL-94 Vxx UL 要求针焰&#xff08;明火&#xff09;试验以评定UL-94的易燃性。 - industry recognized that glowing wires ( caused by electrical overload) may put …

《幻兽帕鲁》游戏公司如何打造全球爆款 《幻兽帕鲁Palworld》怎么在Mac上玩?

玩法融合之外&#xff0c;《幻兽帕鲁》设计的成功和难点其实是把大部分系统及玩法结合得更紧密&#xff0c;做到多个系统之间互相强化。 “下班&#xff0c;该当帕鲁训练家了。”近日&#xff0c;记者从多个游戏群中看到&#xff0c;《幻兽帕鲁》正在取代其他游戏&#xff0c;成…

蓝桥杯-常用STL(一)

常用STL &#x1f388;1.动态数组&#x1f388;2.vector的基础使用&#x1f52d;2.1引入库&#x1f52d;2.2构造一个动态数组&#x1f52d;2.3插入元素&#x1f52d;2.4获取长度并且访问元素&#x1f52d;2.5修改元素&#x1f52d;2.6删除元素&#x1f52d;2.7清空 &#x1f38…

抽象类(Java)、模板方法设计模式

一、概念 在Java中有abstract关键字&#xff0c;就是抽象的意思&#xff0c;可用来修饰类和成员方法。 用abstract来修饰类&#xff0c;那这个类就是抽象类&#xff1b;修饰方法&#xff0c;那这个方法就是抽象方法。 修饰符 abstract class 类名{修饰符 abstract 返回值类型…