首页 > 编程语言 >系统编程——信号通信

系统编程——信号通信

时间:2024-05-31 19:45:08浏览次数:16  
标签:编程 通信 用户 发送 kill 信号 Linux 进程

信号通信

信号(英文翻译为signal)是Unix系统、类Unix系统(比如Linux系统)以及其他POSIX兼容的操作系统中用于实现进程间通信的一种方式。信号是一种异步通信机制。

信号的发生

1. 按键触发

按键触发指的是用户按下某个快捷键,然后由内核发送指定的信号给进程,比如用户准备在Linux系统的终端输入shell命令,则会先开启一个Terminal终端,然后在终端中执行了一个可执行文件,此时操作系统会创建一个进程,并把可执行文件的代码段和数据段加载到进程空间中,并分配CPU时间片给到该进程,此时进程会从就绪态进入运行态。
image
但是在进程执行过程中用户打算提前结束进程,所以用户在终端按下快捷键Ctrl+C,键盘就产生了一个硬件中断,操作系统会把Ctrl+C解释为SIGINT信号并记录在进程的PCB中。

此时CPU会暂停执行用户空间中的代码,然后去执行内核空间中的硬件中断,当硬件中断执行完成后CPU会返回用户空间,但是CPU需要先处理记录在进程PCB中的信号,而CPU发现此时进程PCB中的信号是SIGINT,该信号含义是终止进程,所以进程会切换到终止态,相当于结束进程。

2. 系统异常

硬件异常产生的信号会由系统硬件进行检测,比如进程中执行除以0的指令会导致ALU异常,或者进程中访问了非法内存地址会导致MMU异常,此时内核会发送给进程相关的信号。
image
image

3. 调用接口

Linux系统中提供了一个名字叫做kill()的函数接口,用户利用该接口可以实现主动向指定进程发送信号,用户可以通过man 2 kill查阅函数的使用规则。
image
第一个参数是目标进程的PID
第二个参数则是要发送的信号名称

除了kill()函数之外,Linux系统还提供了一个名称叫做raise()的函数接口,两者的区别是kill()函数可以向指定的进程发送信号,而raise()函数只能向当前进程发送信号。
image

下列是信号的名称
image
可以发现Linux系统中的信号编号为1-64,其中编号为1-31的信号为普通信号,编号为34-64的信号为实时信号。

普通信号

Linux系统中的普通信号也被称为不可靠信号,指的是当进程接收到了很多的信号请求但是又不能及时处理时,不会把信号形成队列,而是把其余未被处理的信号直接丢弃,只留下一个信号。Linux系统中的普通信号是从Unix系统继承过来的。

实时信号

Linux系统中的实时信号也被称为可靠信号,指的是当进程接收到了很多信号请求但是又不能及时处理时,会把未处理的信号形成队列,然后按照顺序依次处理,不会丢弃信号。Linux系统中的实时信号是新增加的。

4. 发送指令

用户除了在程序中调用kill()函数发送信号之外,还可以直接在终端中使用shell命令:kill 给指定PID的进程发送信号,其实kill命令也是调用kill函数来实现信号的发送。如果kill命令没有指定信号名称,则默认发送SIGTERM信号,该信号表示终止进程。

5. 内核检测

当内核检测到某种软件条件发生时也可以通过信号通知进程,例如内核检测到闹钟超时则会产生SIGALRM信号,或者当内核检测到进程向读端已关闭的管道写数据时就产生SIGPIPE信号。

信号的处理

当进程接收到信号之后,可以分为三种情况来对信号进行处理,分别是默认、捕捉和忽略。

1. 默认处理

由于Linux系统中已经对普通信号的含义进行了规定,也就是当进程接收到某个信号后,如果用户没有自定义信号的执行动作,则会采用默认处理的方式对信号进行响应。比如进程接收SIGTERM信号后则会被终止。

2. 捕捉信号

信号捕捉指的是在进程接收到某个指定信号之前,先设计好该信号响应函数,并把该信号和该响应接口进行关联,这样当进程接收到信号之后,就不会执行信号的默认响应动作,而是执行用户指定的响应动作。
image
通过调用signal函数实现
image
第一个参数指的是目标信号的编号(可定义出SIGKILL和SIGTOP信号以外的,常用SIGNUSR1和SIGNUSR2
第二个参数指的是信号的处理函数的地址,是一个函数指针类型,void (*sighandler_t)(int),用户需要按照该类型定义信号处理接口。

3. 忽略信号

忽略信号指的是当进程接收到某个信号后,并不打算执行该信号的相关动作,而选择直接丢弃该信号。用户可以通过调用signal()函数,只不过函数的第二个参数设置为SIG_IGN即可。

信号的阻塞

有时进程会接收到很多来自其他进程的信号,但是该进程暂时不打算对某些指定信号做出响应,所以需要暂时“屏蔽”某些信号。比如程序在执行过程中不打算受到用户Ctrl+C的强制结束进程的影响,所以进程需要阻塞该信号,当该信号到达时对它进行屏蔽,当做“看不见”。

Linux系统中提供了一个名称叫做sigprocmask()的函数接口来设置信号集的属性,使用规则如下:
image
image
阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。

信号的挂起

当进程被系统调度程序进行调度,得到CPU资源进入运行态时,才有能力处理其他进程发送过来的信号,当进程处于其他状态时,就算其他进程发送信号过来,该进程也无法处理。
所以进程中就提供了一个挂起信号集,所有被发送到这个进程的信号首先被放入这个信号集,挂起信号集存储了进程的待处理信号,这些信号必须要等到进程被系统调度的时候才能被进一步响应。

标签:编程,通信,用户,发送,kill,信号,Linux,进程
From: https://www.cnblogs.com/eon4051/p/18225186

相关文章

  • 基于WebSocket的modbus通信(一)- 服务器
    ModbusTcp协议是基于tcp的,但不是说一定要通过tcp协议才能传输,只要能传输二进制的地方都可以。比如WebSocket协议。但由于目前我只有tcp上面的modbus服务器实现,所以我必须先用tcp连接借助已有工具来验证我的服务器是否写正确。效果ModBusTCP协议报文ModBusTCP协议报文比较复......
  • SNCScan:针对SAP安全网络通信(SNC)的安全分析与评估工具
    关于SNCScanSNCScan是一款针对SAP安全网络通信(SNC)的安全分析与评估工具,该工具旨在帮助广大研究人员分析SAP安全网络通信(SNC),并分析和检测SNC配置与SAP组件中的潜在问题。SNC系统参数SNC基础SAP协议,例如DIAG或RFC,本身并没有提供较高的安全保护。为了提高安全性并确保身份验......
  • Java的JDBC编程
     博主主页: 码农派大星.  数据结构专栏:Java数据结构 数据库专栏:MySQL数据库关注博主带你了解更多数据结构知识1.Java的数据库编程:JDBC数据库驱动包:不同的数据库,对应不同的编程语言提供了不同的数据库驱动包,如:MySQL提供了Java的驱动包mysql-connector-java,需......
  • 《Java练习题》Java编程题合集(全)
    《Java练习题》Java编程题合集(全) 前言:不仅仅要实现,更要提升性能,精益求精,用尽量少的时间复杂度和空间复杂度解决问题。初学者:《Java练习题》习题集一  https://www.cnblogs.com/jssj/p/11147566.html《Java练习题》习题集二  https://www.cnblogs.com/jssj/p/1122235......
  • 什么是机器人离线编程? 衡祖仿真
    一、什么是机器人离线编程?机器人离线编程是自动化生产的重要一环。离线编程指,在建立了机器人的三维模拟场景后,经由软件仿真计算,生成控制机器人运动轨迹,进而生成机器人的控制指令。工程师可以由此来控制物理环境中的机器人。与普通机器人示教编程不同,在离线编程过程中,机器人等生......
  • 【React】react函数式编程常用hooks讲解
    ReactHooks是React16.8版本引入的一项重要特性,它极大地简化和优化了函数组件的开发过程。React中常用的Hooks,包括useState、useEffect、useContext、useReducer、useCallback、useMemo、useRef、useLayoutEffect等。这些Hooks涵盖了状态管理、副作用处理、性能......
  • 网络编程
    网络编程--客户端和服务器端客户端和服务器端实现连接和通信服务器端:通过sock套接字进行连接通信#include<WinSock2.h>#include<Windows.h>#include<iostream>#include<WS2tcpip.h>#pragmacomment(lib,"ws2_32.lib")intmain(){ //初始化网络环境 WSADATAdate{0......
  • MIMO-OFDM无线通信技术与matlab实现 阅读笔记与勘误
    第四章OFDM技术1.ZP保持子载波正交性原理:在每个符号前,添加了ZP(zeropad/zeroprefix)。收到的信号为多径信号,多径分量的最大延迟τ<ZP宽度。在收到信号后,假定定时准确,也就是图中FFT窗所示。将下一个符号的ZP部分搬移到当前符号起始位置,也就是将图中长竖线之后的部分搬移到F......
  • 【JavaScript脚本宇宙】编程新视野:JavaScript中的六大重要实用库
    增强你的代码:深入浅出JavaScript实用工具库前言在动态且多变的编程世界中,实用程序库已经成为开发者们提升效率、优化代码的得力助手。本文将深入探讨六个广受欢迎的JavaScript实用程序库,它们各自具有独特的功能和应用场景,无论你是初学者还是资深开发者,或许都能在其中找到......
  • 618精选编程书单:提升你的代码力
    目录......