Linux信号概念、认识、处理动作 ( 2 ) -【Linux通信架构系列 】

news2024/11/25 14:46:16

系列文章目录

C++技能系列
Linux通信架构系列
C++高性能优化编程系列
深入理解软件架构设计系列
高级C++并发线程编程

期待你的关注哦!!!
在这里插入图片描述

现在的一切都是为将来的梦想编织翅膀,让梦想在现实中展翅高飞。
Now everything is for the future of dream weaving wings, let the dream fly in reality.

Linux信号概念、认识、处理动作

  • 系列文章目录
  • 一、信号的基本概念
    • 1、信号一般是怎么产生的?
      • 1.1、某个进程发送给另一个进程或者发送给自己
      • 1.2、由内核发送给某个进程
    • 2、信号在系统中的定义
  • 二、通过kill命令认识一些信号
  • 三、进程的状态
  • 四、常用的Signal信号列表
  • 五、信号处理的相关动作
  • 六、小结

一、信号的基本概念

信号,在很多大型应用程序中都经常出现。信号就是一个通知(事件通知),用来通知某一个进程发生的发生了某一件事。当然,这些事情或者说这些信号一般都是突然事件,或者说都是突然到来的,进程本身并不知道这些信号在什么时候发生。换句话说,信号是异步发生的,又称软件中断

在Nginx中,可以把信号想象成是一个mastrt进程和work进程之间的一个很有效的通信手段,所以把信号看成一种非常简单的短消息。

1、信号一般是怎么产生的?

1.1、某个进程发送给另一个进程或者发送给自己

注意:进程能把信号发送给自己。某个进程把自己执行起来后,再执行一个自己并向原来的自己发送信号是可以的。

如Nginx在运行过程中(1个master进程,多个worker进程),要做热升级。热升级是要启动新的master进程的,那么这个新启动的master进程启动时,通过增加一些命令行参数的手段就可以向旧的master进程发送一些信号,从而控制旧的master进程做一些动作。

1.2、由内核发送给某个进程

(1)通过在键盘上输入一些命令动作,如按Ctrl + C组合键(中断信号)、使用kill命令等。
(2)内存访问异常。除数为0等,硬件会检测到并通知内核等。

2、信号在系统中的定义

信号是有名字的,这些名字都是以SIG开头,不同的系统支持的信号数量各不相同,少则支持十几个,多则支持50~60个。

信号虽然有名字,其实也都是一些数字。准确的说,信号是一些正整数,定义在系统的头文件里,一般在编程的时候包含signal.h(usr/include/)头文件即可。

输入命令可以查询:
sudo find / -name "signal.h" | xargs grep - in "SIGHUP"

这个命令的含义是从根目录开始,寻找一个名字叫做signal.h的文件, -name就是根据名字来查找。在某些文件中查找某行是否包含某个字符串时,可以用上面的命令。(在一批文件里搜索一个字符串)。

grep是文本搜索工具,-i参数表示查找忽略大小写,-n参数表示显示查找到的行号,要查找文本字符串是”SIGHUP“。

xargs参数表示向其他命令传递参数,用了xargs之后,find命令找到的文件内容就能传递到grep中,所以grep实际是在找到的文件内容中进行搜索。

在这里插入图片描述

图1.2.1 从根目录开始,在所有的signal.h文件中寻找含有SIGHUP字符串的行

随便找一个signal.h文件,利用vim编辑器查看内容:
在这里插入图片描述

图1.2.2 该signal.h文件中大概有32个信号

在vim编辑器查看signal.h的结果, 看起来大概有32个信号 ,这些SIG开头的信号其实就是一些宏定义

二、通过kill命令认识一些信号

相信很多人对kill的用法最熟悉的莫过于输入”kill 进程ID“来杀死一个进程。其实kill命令所做的工作也是想进程发送一个信号,如果没有特别的要求,操作系统就会根据该信号,对该进程执行默认的动作,也就是终止该进程。

kill -数字 进程ID 方式发送多种信号,不带 -数字 ,那个数字 默认是15 ,既 -15

表2.1 部分kil命令的数字对应的信号以及收到信号时对应的默认处理动作
kill的参数该参数发出的信号操作系统默认的动作
-1SIGHUP(链接断开)终止掉进程(进程没了)
-2SIGINT(终端中断符,比如Ctrl + C)终止掉进程(进程没了)
-3SIGQUIT(终端退出符,比如Ctrl + \)终止掉进程(进程没了)
-9SIGKILL(终止)终止掉进程(进程没了)
-18SIGCONT(使暂停的进程继续)忽略(进程依旧还在运行不受影响)
-19SIGSTOP(停止),可用SIGCONT继续,但任务被放到了后台停止进程(不是终止,进程还在)
-20SIGTSTP (终端停止符,同Ctrl + Z),但任务被放到了后台,可用SIGCONT继续停止进程(不是终止,进程还在)

值得一提的是-19对应的SIGSTOP信号,该信号用于停止进程,但进程还在,和以往的信号(比如SIGKILL)不一样(SKILL是终止进程,进程不在了)。

接下来,我们测试一下,写一个无限循环、不停输出信息的代码:

#include <stdio.h>
#include <unistd.h>
int main(int argc, char *const *argv)
{
        printf("hello nginx\n");
        for(;;)
        {
                sleep(1);
                printf("进程休息1s\n");
        }
        printf("程序退出!再见!\n");
        return 0}

编译、链接并运行,然后我们kill 5382杀死进程,如图:

在这里插入图片描述

图2.2 附着到nginx进程上的strace工具输出killed by SIGTERM

在这里插入图片描述

图2.2 被kill掉的进程,在终端窗口中显示Terminated(终止)字样

如果输入kill 进程ID就是向该进程发送SIGTERM终止信号,同时进程被终止了,显示显示killed by SIGTERM,说明被SIGTERM信号杀死了。

后续几个信号就不列举了,可以自己去尝试一下。

三、进程的状态

如何查看进程状态呢?

查看进程状态,使用ps命令,在显示的列中增加一个stat 列即可。
ps -eo pid,ppid,sid,tty,pgrp,comm,stat | grep -E ‘bash|PID|nginx’

还有一种方法,ps命令配合aux也可以显示进程状态(aux代表一种BSD风格的显示格式)
ps -aux | grep -E ‘bash|PID|nginx’

如图:

在这里插入图片描述

图3.1 两种方式显示进程状态

STAT列显示进程状态字母是什么意思呢?可以看下表:

表3.2 进程的状态字母对应的状态含义
状态含义
D不可中断的休眠状态(通常是I/O的进程),可以处理信号,有延迟
R可执行状态 & 运行状态(在运行队列里的状态)
S可中断的休眠状态之中(等待某事件完成),可以处理信号
T停止或被追踪(被作业控制信号所停止)
Z僵尸进程
X死掉的进程
<高优先级的进程
N低优先级的进程
L有些页被锁紧内存
ssession leader(会话首进程),其下有子进程
t追踪期间被调试器停止
+位于前台的进程组

可以看到nginx进程的状态是S+状态。S意为sleepling(睡眠),+意为在前台运行。

如果现在用kill -19命令发送SIGSTOP信号来停止nginx进程(不是终止)则进程还在。

看下图的实例演示:
在这里插入图片描述

图3.3 通过kill信号处理来查看进程状态

四、常用的Signal信号列表

常用的Signal信号如表所示:

表4.1 常用信号名称及信号含义列表
信号名称信号含义
SIGHUP(1)(链接断开)终端断开信号。如果终端接口检测到一个链接断开,发送信号到该终端所在的会话首进程,默认动作会导致所有相关的进程退出(Xshell断开就会发送此信号)。kill -1 进程号 也能发送此信号给进程。
SIGALM(定时器超时)一般调用系统函数alarm创建定时器后,定时器超时就会产生这个信号
SIGINT(2)(中断)输入Ctrl + C(如进程正在循环中做一件事),按Ctrl + C 组合键(中断键)就能打断进程正在做的事,按Ctrl + C组合键(中断键)就能打开进程正在做的事,终止进程。但shell会将后台进程对该信号的处理设置忽略(也就是说该进程若在后台运行则不会收到该信号)
SIGSEGV(无效内存)内存访问异常,除数为0等,硬件会检测到并通知内核。其实这个SEGV代表断违例(segmentation violation),有时候运行一个自己写的C程序,如果程序内存访有问题,执行时也会出现这个信号
SIGIO(异步I/O)通知异步I/O信号,如果通信接口套接字接口上有数据到达,或发生一些异步错误,内核就会向进程通知该信号。
SIGCHLD(子进程改变)一个进程终止或停止时,这个信号会被发送给父进程(想象一下官方的Nginx: worker进程终止时,master进程应该会收到内核发出的针对该信号的通知。)
SIGUSR1SIGUSR2(都是用户定义的信号)用户定义的信号,可用于应用程序。
SIGTERM(15)(终止)一般 通过在命令行输入”kill 进程ID“ 命令杀死一个进程时就会触发这个信号,程序收到这个信号后,可以编写代码做退出前的处理工作,实现”优雅退出“
SIGKILL(-9)(终止)该信号不能被忽略,不能被进程本身捕捉,是杀死任意进程的可靠方法
SIGSTOP(19)(停止)该信号不能被忽略,不能被进程本身捕捉,使进程停止执行。可以发送SIGCONT信号让该进程继续执行,但继续执行后该进程会被放入后台
SIGQUIT(3)(终端退出符)Ctrl + \ 组合键会触发该信号。但shell会将后台进程对该信号的处理设置为忽略(也就是说在后台运行则不会收到该信号)
SIGCONT(18)(使暂停的进程继续)使 暂停的进程继续运行
SIGTSTP(20)(终端停止符)Ctrl + Z 组合键触发该信号。 进程被停止,并被放入后台,可以用SIGCONT继续运行

五、信号处理的相关动作

回顾刚才讲的kill命令时,用不同数字向nginx进程发送信号,结果是不同的,如果用-1、-2、-3、-9等发送信号时,结果是不同的,发现nginx进程被杀掉了(用ps看不到了);但如果用-18发信号时(让进程继续运行的信号)时,发现nginx进程没什么反应;用-19、-20发信号时,发现nginx进程停止了,但没有终止(用ps还能看到nginx进程的存在),可以用-18发送信号让停止的nginx进程继续运行。

当某个信号出现时,可以按以下三种方式之一进行处理。这些方法称为信号的处理或与信号相关的动作
(1)执行系统的默认动作

如果在代码中没有特别针对信号的处理代码,当应该进程收到信号时,操作系统(内核)会对该进程执行一个默认动作。不同的信号对应不同的默认动作,但是对于绝大多数信号,内核对进程执行的默认动作是把该进程杀死(终止该进程)。

(2)忽略此信号

如果不希望当收到某个信号的时候,内核执行该信号所对应的默认动作(如把进程杀死),可以通过写一些代码使操作系统忽略此信号,操作系统发现代码中实现了对该信号的忽略,就不会针对该信号对进程采取任何动作。

可能会有一个疑问:如果某个进程忽略了所有的信号,那内核岂不是完全杀不死该进程了?

当然不是这样的,因为只有两个信号不能被忽略(特权信号),就是SIGKILL和SIGSTOP。如果遇到常规杀不死的进程,可以使用kill -9的命令,正常情况下都能把进程杀死。

(3)捕捉该信号

所谓捕捉该信号,就是在代码中写一个信号处理函数,当系统收到该信号时,会自动调用该处理函数来处理。

当然,就算写了自己的信号处理函数,SIGKILL和SIGSTOP这两个信号仍然是特权信号,因此不要写代码去捕捉这两个信号,因为这样的代码是无效的。

六、小结

希望对信号有一个较好的理解,因为在很多大型软件开中,信号的使用都会体现在很多方面。

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

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

相关文章

适合嵌入式开发的GUI(嵌入式学习)

嵌入式开发的GUI如何选择&#xff1f; 常见的嵌入式GUI开发方法轻量级GUI库优缺点 基于Web技术优缺点 Qt框架优缺点 原生开发优缺点 嵌入式系统的限制 常见的嵌入式GUI开发方法 嵌入式开发中的GUI&#xff08;图形用户界面&#xff09;是指在嵌入式系统中实现图形化的用户界面…

Unity核心7——2D动画

一、序列帧动画 &#xff08;一&#xff09;什么是序列帧动画 ​ 我们最常见的序列帧动画就是我们看的日本动画片&#xff0c;以固定时间间隔按序列切换图片&#xff0c;就是序列帧动画的本质 ​ 当固定时间间隔足够短时&#xff0c;我们肉眼就会认为图片是连续动态的&#…

Pandas数据处理与分析教程:从基础到实战

文章目录 前言什么是Pandas&#xff1f;Pandas的安装和导入数据结构Series&#xff08;案例1&#xff1a;创建Series&#xff09;DataFrame&#xff08;案例2&#xff1a;创建DataFrame&#xff09; 数据读取和写入从CSV文件中读取数据&#xff08;案例3&#xff1a;读取CSV文件…

一起学SF框架系列6.2-模块core-Environment

Environment是集成在容器中的抽象接口&#xff0c;它对应用程序环境的两个关键方面进行建模&#xff1a;配置文件&#xff08;profiles&#xff09;和属性&#xff08;properties&#xff09;。 配置文件&#xff08;profiles&#xff09; 配置文件为核心容器中提供了一种机制…

Redis7---单线程和多线程(一)

目录 一、几个面试题 1.Redis的单线程部分 1.2 Redis所谓的“单线程” 1.3 Redis演进变化 1.3.1 Redis 3.x 单线程时代性能很快的原因 1.3.2 Redis 4.0 之前一直采用单线程的主要原因有三个 2. Redis单线程为什么加了多线程特性 3.Redis 6/7的多线程特性和IO多路复用入…

【系统架构】第二章-计算机系统基础知识(一)

计算机硬件 1、处理器&#xff1a;CISC&#xff08;复杂指令集&#xff09;、RISC&#xff08;精简指令集&#xff09; 2、存储器&#xff1a;按照与处理器的物理距离&#xff1a;片上缓存、片外缓存、主存、外存 3、总线&#xff1a;按照总线在计算机中的位置划分&#xff1a…

大厂流出2023年最新软件测试面试题【全】

1.B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行&#xff0c;可以实现跨平台&#xff0c;客户端零维护&#xff0c;维护成本低&#xff0c;但是个性化能力低&#xff0c;响应速度较慢C/S响应速度快&#xff0c;安全性强&#xff0c;一般应用于局域网中&#xff0c;因…

格雷码转换电路

目录 格雷码转换电路 1、简介 1.2、格雷码转化为二进制码原理如下&#xff1a; 1.3、二进制码转化为格雷码原理如下&#xff1a; 2、实验任务 3、程序设计 3.1、格雷码转换二进制 3.2、二进制转换格雷码 4、仿真测试 5、仿真验证 格雷码转换电路 格雷码&#xff0c;…

推荐一款能够节省办公空间的显示器!

作为一名高校科研人员&#xff0c;课题组师生日常科研工作必备电子设备的维护及更新对于科研进度有着极大影响作用。近日购买了最新一代的戴尔显示器E2424HS。 以下是我的一些真实使用体验&#xff1a; 01 外观高端大气 拆箱前&#xff0c;在检查外包装没有任何破损后&#…

城市道路工程设计技术措施

为在城市道路工程建设中正确执行国家和行业有关法律、标准、规范和规程&#xff0c;提高工程建设质量&#xff0c;特制定《城市道路工程设计技术规程》&#xff08;2011年版&#xff09;专门编的。  本办法主要依据国家和行业有关法规、标准、规范和规程等&#xff0c;参照地…

Spring 是什么框架?

对于一门技术&#xff0c;我们需要从为什么要学、学什么以及怎么学这三个方向入手来学习。那在说Spring这三点之前&#xff0c;我们先看Spring之前要学什么。 Java基础、Java语法进阶、MySQL基础操作、MySQL数据库设计和多表操作、JDBC、Maven基础、MyBatis、HMLCSS、JavaScrip…

字节跳动做了3年软件测试,五月无情被辞,想给划水的兄弟提个醒

前言 先简单交代一下背景吧&#xff0c;某不知名 985 的本硕&#xff0c;20 年毕业加入字节&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一直从事软件测试的工作。之前没有实习经历&#xff0c;算是5年的工作经验吧。 这5年之间完成…

全网最全,Web测试点详细整理(测试场景举例+常见问题分析)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Web测试检查表 功…

go环境安装配置(windows)

下载go 安装包 官网&#xff1a; https://go.dev/dl/ go语言中文网&#xff1a; https://studygolang.com/dl 下载压缩包&#xff0c;解压 环境变量配置 GOROOT 配置你解压的目录 在Path中追加一条 %GOROOT%\bin 这里go对比JAVA还多了一个配置&#xff1a; GOPATH 配置go以…

原生微信小程序基础-分包加载自定义组件项目全流程

小程序基础-分包加载&&自定义组件 小程序分包加载 小程序分包加载-为什么要分包加载 微信平台对小程序单个包的代码体积限制为 2M&#xff0c;超过 2M 的情况下可以采用分包来解决即使小程序代码体积没有超过 2M 时也可以拆分成多个包来实现按需加载配置文件能忽略的…

远程控制电脑软件全方位测评,远程控制工具哪家强

*本文内容以及测试数据来自“B站” 作者&#xff1a;小李student 先问大家一个问题&#xff0c;你心目中最好的远控软件是哪个? 今天我要测评几个有意思的远控软件&#xff0c;他们分别是todesk 、向日葵、RayLink、parsec、其实我还测试了微软自带的远程控制&#xff0c;但…

用 Optaplanner 实现云资源优化:建模详解

引言 装箱问题是一个经典的计算机科学优化问题,它的目标是将一堆物品尽可能地放入一些容器中,以最小化容器数量或最大化容器利用率。在实际应用中,我们可以在物流、资源调度、计算机集群等领域看到装箱问题的应用。 问题描述 在云计算领域,装箱问题同样非常重要。比如,…

Java中关于字符串常量池的详解!!!

字符串常量池 前言1. 直接赋值法&#xff0c;默认从常量池中取对象2. new一个对象3. 字符串常量池、字符串对象、内部的value引用、具体的字符数组之间的关系4. 手动入池方法&#xff1a;intern方法 前言 Java使用 “ ” 称为字符串常量&#xff0c;为了提高程序的运行速度&am…

2023最新软件测试面试题【1000道题含答案】

1、自动化代码中,用到了哪些设计模式? 单例设计模式 工厂模式PO设计模式数据驱动模式面向接口编程设计模式 2、什么是断言( Assert) ? 断言Assert用于在代码中验证实际结果是不是符合预期结果&#xff0c;如果测试用例执行失败会抛出异常并提供断言日志 3、什么是web自动化测…

非法收集儿童数据,微软与 2000w 美元和解

文章目录 &#x1f928; 非法收集儿童数据&#xff0c;微软与 2000w 美元和解&#x1f4c8; 苹果股价和 Vision Pro 一样高涨&#x1f46e;‍♀️ 美国证监会狙击币安和其老板赵长鹏3️⃣ 红杉资本一拆为三&#x1f62e; 加息出乎意料&#xff01;澳洲央行对抗通胀&#x1f91c…