【Linux】—— 信号的基本介绍(一)

news2024/11/17 13:53:07

目录

(一)生活角度的信号

(二)查看信号列表

(三)技术应用角度的信号

(四)信号的概念

 (五)小结


(一)生活角度的信号

我们要学习有关信号的相关知识,首先要知道什么是信号。接下来我先从生活中的例子来带大家逐步认识。

在日常生活中,"信号" 这个词可以涵盖多个领域,以下是一些常见的生活中的信号: 

  • 红绿灯、语言、姿态、表情 、鸟鸣、风声、情绪、闹钟、狼烟等等

 就比如上诉的 红绿灯:我们都知道“红灯停,绿灯行”,对于不同的颜色都会匹配相应的动作。此时我就要问大家为什么会有这个动作呢?

  • 其实很简单,因为曾经有人或者有事等 “培养”过你,使你脑海中产生了这种印象,以至于即使现在不是身处红绿灯处,我们也知道不同的颜色我们该怎么进行处理!!

同理,若此时存在一个进程,而信号就是一个数字(可以通过 kill -l 查看,稍后会讲),即使进程没有收到信号的时候,它也知道当收到信号的时候能够准备识别并知道该如何处理(因为程序员设计进程的时候,早就已经设计好了对信号识别处理的能力!!) 


 如果大家还是困惑我在给大家举个例子:

  • 假设你在网上买了很多件商品,在等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临时,你该怎么处理快递。也就是你能“识别快递”;
  • 当快递员到了你楼下,你也收到快递到来的通知,但是你正在打游戏,需5min之后才能去取快递。那么在在这5min之内,你并没有下去去取快递,但是你是知道有快递到来了。也就是取快递的行为并不是一定要立即执行,可以理解成“在合适的时候去取”;
  • 在收到通知,再到你拿到快递期间,是有一个时间窗口的,在这段时间,你并没有拿到快递,但是你知道有一个快递已经来了。本质上是你“记住了有一个快递要去取”;
  • 当你时间合适,顺利拿到快递之后,就要开始处理快递了。而处理快递一般方式有三种:1. 执行默认动作(幸福的打开快递,使用商品)2. 执行自定义动作(快递是零食,你要送给你你的女朋友)3. 忽略快递(快递拿上来之后,扔掉床头,继续开一把游戏);
  • 快递到来的整个过程,对你来讲是异步的,你不能准确断定快递员什么时候给你打电话.

(二)查看信号列表
 

我们可以使用kill -l命令可以察看系统定义的信号列表。具体如下:

【解释说明】

  1. 首先,在Linux系统中,【1-31】号的信号通常是标准的POSIX信号,大家也可以叫做普通信号(这是我们学习的主要);
  2. 其次,大家可以发现没有32、33号信号,31号之后就是34号。在POSIX标准中,并没有规定32和33号这样的信号,因此在通常的Linux系统中,这些数字对应的信号并没有特殊的含义。这并不是系统实际上没有定义更高编号的信号,而是在POSIX标准中未规定的部分给了系统一些灵活性,使得系统可以自定义和扩展信号的使用;
  3. 最后34号之后的统称为“实时信号”,对于这部分信号,大家可以不用关心;
  4. 最后大家也可以发现,每个都是以 数字开头紧跟一个大写的字符串。这里的数字就是“信号”,后面大写的字符串就是“宏”。

  1. SIGHUP (1): 挂起信号
  2. SIGINT (2): 中断信号
  3. SIGQUIT (3): 退出信号
  4. SIGILL (4): 非法指令信号
  5. SIGTRAP (5): 跟踪/断点陷阱信号
  6. SIGABRT (6): 中止信号
  7. SIGBUS (7): 总线错误信号
  8. SIGFPE (8): 浮点异常信号
  9. SIGKILL (9): 强制杀死进程信号
  10. SIGUSR1 (10): 用户自定义信号 1
  11. SIGSEGV (11): 段错误信号
  12. SIGUSR2 (12): 用户自定义信号 2
  13. SIGPIPE (13): 管道破裂信号
  14. SIGALRM (14): 超时信号
  15. SIGTERM (15): 终止信号
  16. SIGSTKFLT (16): 协程栈错误信号
  17. SIGCHLD (17): 子进程状态改变信号
  18. SIGCONT (18): 继续执行信号
  19. SIGSTOP (19): 停止进程信号
  20. SIGTSTP (20): 终端停止信号
  21. SIGTTIN (21): 后台进程尝试读取控制终端
  22. SIGTTOU (22): 后台进程尝试写入控制终端
  23. SIGURG (23): 紧急情况信号
  24. SIGXCPU (24): 超过CPU时间限制信号
  25. SIGXFSZ (25): 超过文件大小限制信号
  26. SIGVTALRM (26): 虚拟定时器信号
  27. SIGPROF (27): 用于分析的定时器信号
  28. SIGWINCH (28): 窗口大小改变信号
  29. SIGIO (29): 异步I/O事件通知信号
  30. SIGPWR (30): 电源故障信号
  31. SIGSYS (31): 非法系统调用信号

(三)技术应用角度的信号

有了上述的 知识储备之后,接下来通过简单的代码来理解信号!!!

  演示如下:

除了上述方法之外,还可以通过【ctrl+c】的方式终止一个前台进程

【现象解释】 

  • 用户输入命令,在Shell下启动一个前台进程。
  • 用户按下【Ctrl+C】,,这个键盘输入产生一个硬件中断,被OS获取,解释成信号,发送给目标前台进程。前台进程因为收到信号,进而引起进程退出

【解释说明】 

  • 前台进程是在终端中直接运行的进程,它会占用终端并接收来自用户的输入。通常,用户可以看到前台进程的输出,并且可以与之交互;
  • 前台进程的执行会阻塞终端,直到该进程完成或被暂停。

相应的也有后台进程(使用 & 将进程放到后台执行

  • 后台进程是在终端中以非阻塞方式运行的进程。用户可以继续输入命令和执行其他任务,而后台进程在后台默默执行;
  • 后台进程通常用于执行长时间运行的任务,而不占用用户的终端。

 演示如下:

 

注意

  • 1. Ctrl-C 产生的信号只能发给前台进程。一个命令后面加个&可以放到后台运行,这样Shell不必等待进程结束就可以接受新的命令,启动新的进程。
  • 2. Shell可以同时运行一个前台进程和任意多个后台进程,只有前台进程才能接到像 Ctrl-C 这种控制键产生的信号。
  • 3. 前台进程在运行过程中用户随时可能按下 Ctrl-C 而产生一个信号,也就是说该进程的用户空间代码执行到任何地方都有可能收到 SIGINT 信号而终止,所以信号相对于进程的控制流程来说是异步(Asynchronous)的。

 而此时,大家是否想到一点。对于 Ctrl-C 指令,默认执行的便是终端信号的作用,与我们的 2号信号的效果类似,那么到底是不是呢?我简单的演示下,将 2 号信号的默认执行动作改了,看是否和我们预想的类似。

代码展示:

#include<iostream>
#include<unistd.h>
#include <sys/types.h>
#include<signal.h>

void handle(int signa){
    std::cout << "get a siganl:" << signa << std::endl;
}

int main()
{
    signal(2,handle);
    while(true){
        std::cout << "我是一个进程,我正在运行...,pid:" << getpid() <<std::endl;
        sleep(1);
    }
    return 0;
}

效果演示:

其次,除了上述终止进程的方法之外,还可以使用【ctrl+\】

 【解释说明】

  • 而这里的【ctrl+\】其实就是 3 号信号所属,我也可以给大家验证一哈(同样的让3号信号执行我们自定义的方法)

 效果演示:


(四)信号的概念

综上所述,信号是进程之间事件异步通知的一种方式,属于软中断

 理解信号是软中断需要考虑计算机系统中的中断和信号两个概念。

中断:

  • 中断是计算机系统中的一种机制,用于处理与正常执行流程无关的事件。这些事件可能来自硬件,例如硬件故障、定时器到期、输入设备的输入等。当系统接收到中断信号时,当前执行的程序会被中断,系统会转而执行相应的中断处理程序。中断可以是硬中断(由硬件触发)或软中断(由软件触发)。

信号是软中断:

  • 信号是一种用于在软件层面通知进程发生了某个事件的机制。这些事件可以是来自其他进程的通知、异常情况、用户的交互等。当系统检测到某个事件时,会向相应的进程发送一个信号。进程可以事先定义信号的处理方式,比如忽略、捕获、或执行默认操作。

因此综合起来,将信号称为软中断是因为它类似于硬中断的概念,但它是在软件层面实现的。信号提供了一种轻量级的通信和事件处理机制,允许进程在运行时响应各种事件,而不需要像硬中断那样涉及到硬件层面的处理。


 (五)小结

  • 每个信号都有一个唯一的编号。常见的信号有诸如SIGKILL(终止进程)、SIGTERM(终止进程,但可被捕获和忽略)等。
  • 进程可以对不同的信号设置不同的处理方式,包括:
    • 默认操作: 操作系统默认对信号执行的动作。
    • 忽略信号: 进程可以选择忽略某个信号。
    • 捕获信号: 进程可以注册一个信号处理函数,以在接收到信号时执行自定义操作。
  • 常见信号:

    • 一些常见的信号包括:
      • SIGINT(2): 由中断字符(通常是Ctrl+C)发送,用于中断正在运行的程序。
      • SIGTERM(15): 用于请求进程正常终止。
      • SIGKILL(9): 用于强制终止进程。
      • SIGHUP(1): 表示终端挂起或控制进程终止。

以上便是本期信号概念的基本介绍。下期我将给大家介绍“信号的产生”相关知识!!!

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

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

相关文章

Java 数据结构集合

文章目录 Java 数据结构1. 基本数据结构1.1 数组 (Array)1.2 链表 (Linked List)1.3 栈 (Stack)1.4 队列 (Queue)双向队列优先级队列 2. 树形数据结构2.1 二叉树 (Binary Tree)2.2 堆 (Heap) 3. 散列数据结构3.1 哈希表 (Hash Map)3.2 LinkedHashMap3.3 TreeMapConcurrentHashM…

pytorch(二)梯度下降算法

文章目录 优化问题梯度下降随机梯度下降 在线性模型训练的时候&#xff0c;一开始并不知道w的最优值是什么&#xff0c;可以使用一个随机值来作为w的初始值&#xff0c;使用一定的算法来对w进行更新 优化问题 寻找使得目标函数最优的权重组合的问题就是优化问题 梯度下降 通…

Nginx问题分析

问题再现 分析问题&#xff1a; 就是通过http://182.44.16.68:8077/web-ui/static/js/chunk-libs.82635094.js 地址访问&#xff0c;找不到对应的js文件 首先确认文件在服务器的位置 发现这个目录下确实有这个js文件&#xff0c;那问题就在于http://182.44.16.68:8077/web-ui…

225.用队列实现栈(附带源码)

目录 一、思路 二、源码 一、思路 所以&#xff0c;创建两个队列 入栈&#xff0c;那个不空入那个 出栈&#xff0c;移动不空的队列的前n-1个到空队列&#xff0c;出队列第n个 很简单 总的来说&#xff0c;就是 下面直接手撕代码&#xff1a; 二、源码 typedef int QDa…

Unity_使用Image和脚本生成虚线段

生成如图样式的虚线段 原理&#xff1a;使用Image做一条线段&#xff0c;这个方法的原理就是给固定的片元长度&#xff0c;对Image进行分割&#xff0c;把片元添加到一个列表中&#xff0c;然后循环对列表中的偶数位进行隐藏&#xff0c;也可以调整线段的宽度 缺陷&#xff1…

Pandas.Series.idxmin() 最小值索引 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.2.0 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 传送门&#xff1a; Pandas API参考目录 传送门&#xff1a; Pandas 版本更新及新特性 传送门&…

Java Web(二)--HTML

基本介绍 官网文档地址: HTML 教程 HTML&#xff08;HyperText Mark-up Language&#xff09;即超文本标签语言&#xff1b;HTML 文本是由 HTML 标签组成的文本&#xff0c;可以包括文字、图形、动画、声音、表格、链接等&#xff1b;HTML 的结构包括头部&#xff08;Head&…

如何通过内网穿透+代理共享网络

去年写了一篇博客&#xff1a;如何通过代理共享网络&#xff0c;在这篇文章探索了怎么在同一个局域网内共享代理服务。不过&#xff0c;它的实用性也比较缺乏&#xff0c;要求必须处于同一个局域网之下&#xff0c;大多数时候&#xff0c;我们可能很难有这样的环境。所以&#…

【GitHub项目推荐--12 年历史的 PDF 工具开源了】【转载】

最近在整理 PDF 的时候&#xff0c;有一些需求普通的 PDF 编辑器没办法满足&#xff0c;比如 PDF 批量合并、编辑等。 于是&#xff0c;我就去 GitHub 上看一看有没有现成的轮子&#xff0c;发现了这个 PDF 神器「PDF 补丁丁」&#xff0c;让人惊讶的是这个 PDF 神器有 12 年的…

基于SpringBoot Vue美食网站系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

mysql生成最近24小时整点/最近30天/最近12个月时间临时表

文章目录 生成最近24小时整点生成最近30天生成最近12个月 生成最近24小时整点 SELECT-- 每向下推1行, i比上次减去1b.*, i.*,DATE_FORMAT( DATE_SUB( NOW(), INTERVAL ( -( i : i - 1 ) ) HOUR ), %Y-%m-%d %H:00 ) AS time FROM-- 目的是生成12行数据( SELECTa FROM( SELECT…

可直接将视频转文字的工具,速到快到离谱!

如何将视频转换成文字&#xff0c;推荐大家使用视频提取文案小助手&#xff0c;三秒一键搞定&#xff0c;真的快到离谱​&#xff01; 不少草根博主在做短视频的时候&#xff0c;就有很多人给大家支招让大家先模仿后超越的模式&#xff0c;激起一众爱好短视频的草根博主成为短…

Scrapy爬虫在新闻数据提取中的应用

Scrapy是一个强大的爬虫框架&#xff0c;广泛用于从网站上提取结构化数据。下面这段代码是Scrapy爬虫的一个例子&#xff0c;用于从新闻网站上提取和分组新闻数据。 使用场景 在新闻分析和内容聚合的场景中&#xff0c;收集和组织新闻数据是常见需求。例如&#xff0c;如果我…

【小黑嵌入式系统第十六课】PSoC 5LP第三个实验——μC/OS-III 综合实验

上一课&#xff1a; 【小黑嵌入式系统第十五课】μC/OS-III程序设计基础&#xff08;四&#xff09;——消息队列&#xff08;工作方式&数据通信&生产者消费者模型&#xff09;、动态内存管理、定时器管理 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂…

纯注解开发bean

注解开发定义bean&#xff1a;Controller:用于表现层bean定义&#xff1b;Service&#xff1a;用于业务层bean定义&#xff1b;Repository&#xff1a;用于数据层bean定义。 我们先来完成数据层和业务逻辑层的注解 数据层&#xff1a; package org.example.dao.impl;import or…

智慧博物馆信息化系统建设(3)

博物馆智能电子导览系统 IPAD智能化定制服务 系统采用的IPAD。使用者通过智能IPAD终端上的三维立体导图,可以在参观的同时,随时读取展馆平面地图以及展品相关信息,然后选择相关服务。简单操作便可获得文字、图片、声音以及视频资料展现给使用者。 游客通过该智能IPAD终端…

构建中国人自己的私人GPT—与文档对话

先看效果 他可以从上传的文件中提取内容作为答案。上传文件摄取速度 摄取速度取决于您正在摄取的文档数量以及每个文档的大小。为了加快摄取速度&#xff0c;您可以在配置中更改摄取模式。 存在以下摄取模式&#xff1a; simple&#xff1a;历史行为&#xff0c;一次按顺序摄…

03 SpringBoot实战 -微头条之首页门户模块(跳转某页面自动展示所有信息+根据hid查询文章全文并用乐观锁修改阅读量)

1.1 自动展示所有信息 需求描述: 进入新闻首页portal/findAllType, 自动返回所有栏目名称和id 接口描述 url地址&#xff1a;portal/findAllTypes 请求方式&#xff1a;get 请求参数&#xff1a;无 响应数据&#xff1a; 成功 {"code":"200","mes…

RubbleDB: CPU-Efficient Replication with NVMe-oF——论文泛读

ATC 2023 Paper 论文阅读笔记整理 问题 由于需要执行昂贵的后台压缩操作&#xff0c;CPU 往往是持久键值存储的性能瓶颈。在日志结构合并树&#xff08;LSM树&#xff09;&#xff0c;标准的基于磁盘的键值存储设计[2,4,8,22,41]&#xff0c;压缩可以在生产工作负载中消耗高达…

基于FPGA的OFDM基带发射机的设计与实现

文章目录 前言一、OFDM描述二、本系统的实现参照 1.IEEE 802.11a协议主要参数2.不同调制方式与速率 3. IFFT映射关系4. IEEE 802.11a物理层规范5. PPDU帧格式三、设计与实现 1.扰码2.卷积编码与删余3.数据交织4.符号调制5.导频插入6.IFFT变换 7.循环前缀&加窗8.训练序列生成…