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

明镜止水,长话短说。


目录

  • 信号的概念、认识、处理动作
    • 信号的基本概念
    • 通过kill命令认识一些信号
    • 进程状态
      • 信号测试:
    • 信号处理的相关动作
      • 执行系统默认动作
      • 忽略某个信号
      • 捕捉某个信号

信号的基本概念

信号,在服务器编程和大型应用程序中即为常见。信号就是一个通知(事件通知),用来通知某个进程发生了某一件事。 很多时候,信号都是突然产生的,比如,一个程序某个地方出现异常,它给自己发送一个中断自己进程的信号,此时程序可能迎来结束,从而防止更大异常(来自游戏闪退的怨念),换一句话,信号是异步发生的,又称“软件中断”。

信号的产生:
(1)某个进程发送给另一个进程或者发送给自己
(2)由内核发送给某个进程

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

信号名字一般都为SIG开头的字母组成,但基于头文件源代码来看,却是数字。

//查看各signal.h 中文件SIGHUP信号的位置
root@ubuntu:/home/qiye/Desktop# sudo find / -name "signal.h" | xargs grep -in "SIGHUP"
/usr/src/linux-headers-5.11.0-49/arch/mips/include/uapi/asm/signal.h:25:#define SIGHUP       1  /* Hangup (POSIX).  */
/usr/src/linux-headers-5.11.0-49/arch/xtensa/include/uapi/asm/signal.h:35:#define SIGHUP         1
/usr/src/linux-headers-5.11.0-49/arch/s390/include/uapi/asm/signal.h:26:#define SIGHUP           1
/usr/src/linux-headers-5.11.0-49/arch/ia64/include/uapi/asm/signal.h:13:#define SIGHUP       1
/usr/src/linux-headers-5.11.0-49/arch/x86/include/uapi/asm/signal.h:23:#define SIGHUP        1
/usr/src/linux-headers-5.11.0-49/arch/sparc/include/uapi/asm/signal.h:12:#define SIGHUP      1
/usr/src/linux-headers-5.11.0-49/arch/arm/include/uapi/asm/signal.h:18:#define SIGHUP        1
/usr/src/linux-headers-5.11.0-49/arch/parisc/include/uapi/asm/signal.h:5:#define SIGHUP      1
/usr/src/linux-headers-5.11.0-49/arch/m68k/include/uapi/asm/signal.h:18:#define SIGHUP       1
.....

打开任意一个signal.h文件:

vim /usr/src/linux-headers-5.11.0-49/arch/x86/include/uapi/asm/signal.h


为了方便使用信号,通过使用define预处理器建立数字的别名。

通过kill命令认识一些信号

kill命令常用来杀死了一个进程,我印象最深、用得最多的一句就是sudo kill -9 进程号,但现在,入这大坑后,kill就不再是单纯用来杀死进程这么简单,而是通过使用kill命令给一个进程发送信号来控制进程的中断、再续、终止来影响程序状态的一个命令。

常用的kill参数对应的信号

kill的参数 该参数发出的信号以及操作系统动作
-1 SIGHUP(连接断开),终止进程(进程没了)
-2 SIGINT(终端中断符,如Ctrl+C),终止进程(进程没了)
-3 SIGQUIT(中断退出符, 如Ctrl+),终止进程(进程没了)
-9 SIGKILL(终止),终止进程(进程没了)
-18 SIGCONT(使暂停的进程继续),忽略(进程继续运行不受影响)
-19 SIGSTOP(停止),可使用SIGCONT继续,任务放到后台,停止进程(不是终止,进程还在)
-20 SIGTSTP(终端停止符,同Ctrl+Z),任务于后台,可使用SIGCONT继续,停止进程(不是终止,进程还在)

进程状态

查看进程状态(STAT选项)

ps -eo pid,ppid,sid,tty,pgrp,comm,stat | grep -E '程序检索字段'PID    PPID     SID TT          PGRP COMMAND         STAT1       0       1 ?              1 systemd         Ss2       0       0 ?              0 kthreadd        S3       2       0 ?              0 rcu_gp          I<4       2       0 ?              0 rcu_par_gp      I<6       2       0 ?              0 kworker/0:0H-ev I<9       2       0 ?              0 mm_percpu_wq    I<10       2       0 ?              0 rcu_tasks_rude_ S

其中STAT,是这些进程的一个状态,进程状态字母对应的状态含义:

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

信号测试:

一样,ssh连接ubuntu,打开两个终端,一个终端负责程序的执行和结果,另一个负责进程的状态和kill命令的执行。

第一个终端:
C++简单代码编写:

#include<iostream>
#include<unistd.h>
#include<signal.h>
using namespace std;int main() {pid_t pid;cout << "Linux C++" << endl;while (1){sleep(1);cout << "子进程" << endl;}cout << "end!" << endl;return 0;
}

C++文件编译和执行:

g++ -o t141 /mnt/hgfs/c/t141.cpp
./t141
Linux C++
子进程
子进程
子进程
子进程

第二个终端:

#此时程序状态为置于前台的可中断休眠状态
root@ubuntu:/home/qiye# ps -eo pid,ppid,sid,tty,pgrp,comm,stat | grep -E 't141'10095    6202    5942 pts/1      10095 t141            S+#发送SIGSTOP(停止)信号
root@ubuntu:/home/qiye# kill -19 10095/#此时程序为停止或被追踪的状态
root@ubuntu:/home/qiye# ps -eo pid,ppid,sid,tty,pgrp,comm,stat | grep -E 't141'10095    6202    5942 pts/1      10095 t141            T

第一个终端出现stopped的提示:

继续使用第二个终端:

#发送SIGCONT(使暂停的进程继续)信号,恢复程序运行
root@ubuntu:/home/qiye# kill -18 10095#可以发现恢复回S的状态,但是+号没了,说明已经不是前台运行了,
#你会发现再第一个终端里使用Ctrl+C无法终止程序运行
root@ubuntu:/home/qiye# ps -eo pid,ppid,sid,tty,pgrp,comm,stat | grep -E 't141'10095    6202    5942 pts/1      10095 t141            S

程序继续运行:

但是Ctrl+C无法终止它:

在第二个终端中使用kill -9 终止程序:

root@ubuntu:/home/qiye# kill -9 10095
root@ubuntu:/home/qiye# ps -eo pid,ppid,sid,tty,pgrp,comm,stat | grep -E 't141'
root@ubuntu:/home/qiye#

信号处理的相关动作

执行系统默认动作

当进程收到一个信号时,操作系统(内核)就会对该进程执行一个默认动作,
相应的信号会有相应的默认动作,但大多数时候操作系统的默认动作是终止。

忽略某个信号

当不希望一个进程收到某个信号时,就要使操作系统不对这个信号做出默认动作,常用的是signal(信号名, SIG_IGN)函数,作用是忽略某个信号,操作系统就会忽略这个信号名,但两个信号列外,SIGKILL信号和SIGSTOP信号,这俩不能被忽略,你也不希望一个程序无法被任何手段终止吧?

捕捉某个信号

signal(信号名, 自定义函数),专门捕捉某个信号名,并且成功捕捉后可以送进自定义函数里实现自定义功能,SIGKILL信号和SIGSTOP信号这俩依旧列外。

Linux C++ 通信 - 信号的概念、认识、处理动作相关推荐

  1. Linux 进程通信 -- 信号

    一.概述 信号用于保持进程间的通信,可以备发送到一个进程或者一组进程,发送给进程的这个唯一信息通常是标志信号的一个数.信号可从键盘终端产生.虚拟内存中非法访问系统资源等情况下产生.信号异步发生,收到信 ...

  2. linux c 禁止对外通信,Linux c 屏蔽信号、切换信号

    信号导致的问题 不是任何信号我们都需要的,如果遇到我们不想处理的信号,我们怎么避免这个信号? 1.      信号屏蔽 intsigprocmask(int how,//操作方式 SIG_BLOCK屏 ...

  3. Linux 进程信号:信号的概念、生命周期、产生流程、阻塞

    信号的概念 信号的生命周期 信号的阻塞 信号的概念 信号 信号是一个软中断.操作系统通过信号通知某个进程发生了某件事件,然后中断这个进程当前操作,让它优先去处理这个事件. 我们在linux下常用的ki ...

  4. linux 可定义信号数,Linux系统编程(20)——信号基本概念

    信号及信号来源 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知 ...

  5. linux内核定义的常用信号6,Linux中的信号

    在 Linux 中,理解信号的概念是非常重要的.这是因为,信号被用于通过 Linux 命令行所做的一些常见活动中.例如,每当你按 Ctrl+C 组合键来从命令行终结一个命令的执行,你就使用了信号.每当 ...

  6. linux系统发送信号的系统调用是,linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction...

    信号发送函数sigqueue和信号安装函数sigaction sigaction函数用于改变进程接收到特定信号后的行为. sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然 ...

  7. linux exec 二程序,二十五、Linux 进程与信号---exec函数

    25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...

  8. linux 进程通信比较,浅析Linux进程通信的几种方式及其比较

    摘要:本文通过对Linux下几种主要通信方式进行概述,并结合Linux系统的系统调用对OS中的实现进行简要概述,并对其优缺点进行分析,阐述了在不同通信情况下应该选择何种通信方式进行选择. 关键词:Li ...

  9. Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结

    Linux进程通信的四种方式--共享内存.信号量.无名管道.消息队列|实验.代码.分析.总结 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须 ...

最新文章

  1. 一篇与众不同的 String、StringBuilder 和 StringBuffer 详解
  2. python 类的功能,字符串字节,嵌套等相关学习总结
  3. 俄亥俄州立大学计算机科学转学成功,俄亥俄州立大学转学成功率83.38%!!
  4. 好看好用的花前月下网易云等级代挂程序(支持扫码登录)
  5. 成员/方法/属性/私有
  6. python生成一圈数包裹一圈数的数组
  7. 大规模数据生成 (500万条数据)
  8. python——redis连接与使用
  9. 如何修复最常见的 macOS 11 Big Sur 问题?
  10. wowza 技术交流群/ wowza 流媒体软件交流群
  11. ESP8266 WIFI模块开发入门1 开发环境搭建
  12. matlab的clear函数,[转载]matlab学习笔记(一)之clear,clc,close劝函数
  13. 【ABAP】销售订单修改税率
  14. 计算机键盘打字基础知识,计算机基础知识:计算机键盘的使用
  15. 作为DQM的首次战棋尝试,《勇者斗恶龙战略版》何以开局便成功
  16. 这几所院校会压分!请注意!
  17. JS对浏览器地址的操作
  18. Excel找最大值操作
  19. 从打游戏的显卡,到科学先锋,一篇文章读懂异构计算
  20. 什么是ALM?应用程序生命周期管理体系有哪些?

热门文章

  1. Ubuntu系统显卡驱动缺失,附加驱动页面驱动选项灰色不可选
  2. js+v-html+正则表达式去除所有 nbsp和html标签( nbsp 换行 )
  3. python卷积_直观地展示卷积积分,Python实例演示
  4. 5分钟实现漂亮的CSS加载动画,纯CSS实现加载动画
  5. 最好看的TabBar(Vue)
  6. atan2--四象限的反正切函数
  7. 北工大计算机学院男女比例,北工大为什么最牛?为什么说好男不上北工大?
  8. 网站信息系统安全等级保护
  9. IIRC: Incremental Implicitly-Refined Classification 论文阅读笔记
  10. win7中国银行网银无法登陆的解决