Linux C++ 通信 - 信号的概念、认识、处理动作
信号的概念、认识、处理动作
明镜止水,长话短说。
目录
- 信号的概念、认识、处理动作
- 信号的基本概念
- 通过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++ 通信 - 信号的概念、认识、处理动作相关推荐
- Linux 进程通信 -- 信号
一.概述 信号用于保持进程间的通信,可以备发送到一个进程或者一组进程,发送给进程的这个唯一信息通常是标志信号的一个数.信号可从键盘终端产生.虚拟内存中非法访问系统资源等情况下产生.信号异步发生,收到信 ...
- linux c 禁止对外通信,Linux c 屏蔽信号、切换信号
信号导致的问题 不是任何信号我们都需要的,如果遇到我们不想处理的信号,我们怎么避免这个信号? 1. 信号屏蔽 intsigprocmask(int how,//操作方式 SIG_BLOCK屏 ...
- Linux 进程信号:信号的概念、生命周期、产生流程、阻塞
信号的概念 信号的生命周期 信号的阻塞 信号的概念 信号 信号是一个软中断.操作系统通过信号通知某个进程发生了某件事件,然后中断这个进程当前操作,让它优先去处理这个事件. 我们在linux下常用的ki ...
- linux 可定义信号数,Linux系统编程(20)——信号基本概念
信号及信号来源 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知 ...
- linux内核定义的常用信号6,Linux中的信号
在 Linux 中,理解信号的概念是非常重要的.这是因为,信号被用于通过 Linux 命令行所做的一些常见活动中.例如,每当你按 Ctrl+C 组合键来从命令行终结一个命令的执行,你就使用了信号.每当 ...
- linux系统发送信号的系统调用是,linux系统编程之信号:信号发送函数sigqueue和信号安装函数sigaction...
信号发送函数sigqueue和信号安装函数sigaction sigaction函数用于改变进程接收到特定信号后的行为. sigqueue()是比较新的发送信号系统调用,主要是针对实时信号提出的(当然 ...
- linux exec 二程序,二十五、Linux 进程与信号---exec函数
25.1 介绍 在用 fork 函数创建子进程后,子进程往往要调用一种 exec 函数以执行另一个程序 当进程调用一种 exec 函数时,该进程完全由新程序代换,替换原有进程的正文,而新程序则从其 m ...
- linux 进程通信比较,浅析Linux进程通信的几种方式及其比较
摘要:本文通过对Linux下几种主要通信方式进行概述,并结合Linux系统的系统调用对OS中的实现进行简要概述,并对其优缺点进行分析,阐述了在不同通信情况下应该选择何种通信方式进行选择. 关键词:Li ...
- Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结
Linux进程通信的四种方式--共享内存.信号量.无名管道.消息队列|实验.代码.分析.总结 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须 ...
最新文章
- 一篇与众不同的 String、StringBuilder 和 StringBuffer 详解
- python 类的功能,字符串字节,嵌套等相关学习总结
- 俄亥俄州立大学计算机科学转学成功,俄亥俄州立大学转学成功率83.38%!!
- 好看好用的花前月下网易云等级代挂程序(支持扫码登录)
- 成员/方法/属性/私有
- python生成一圈数包裹一圈数的数组
- 大规模数据生成 (500万条数据)
- python——redis连接与使用
- 如何修复最常见的 macOS 11 Big Sur 问题?
- wowza 技术交流群/ wowza 流媒体软件交流群
- ESP8266 WIFI模块开发入门1 开发环境搭建
- matlab的clear函数,[转载]matlab学习笔记(一)之clear,clc,close劝函数
- 【ABAP】销售订单修改税率
- 计算机键盘打字基础知识,计算机基础知识:计算机键盘的使用
- 作为DQM的首次战棋尝试,《勇者斗恶龙战略版》何以开局便成功
- 这几所院校会压分!请注意!
- JS对浏览器地址的操作
- Excel找最大值操作
- 从打游戏的显卡,到科学先锋,一篇文章读懂异构计算
- 什么是ALM?应用程序生命周期管理体系有哪些?
热门文章
- Ubuntu系统显卡驱动缺失,附加驱动页面驱动选项灰色不可选
- js+v-html+正则表达式去除所有 nbsp和html标签( nbsp 换行 )
- python卷积_直观地展示卷积积分,Python实例演示
- 5分钟实现漂亮的CSS加载动画,纯CSS实现加载动画
- 最好看的TabBar(Vue)
- atan2--四象限的反正切函数
- 北工大计算机学院男女比例,北工大为什么最牛?为什么说好男不上北工大?
- 网站信息系统安全等级保护
- IIRC: Incremental Implicitly-Refined Classification 论文阅读笔记
- win7中国银行网银无法登陆的解决