目录
我们要学习有关信号的相关知识,首先要知道什么是信号。接下来我先从生活中的例子来带大家逐步认识。
在日常生活中,"信号" 这个词可以涵盖多个领域,以下是一些常见的生活中的信号:?
?就比如上诉的?红绿灯:我们都知道“红灯停,绿灯行”,对于不同的颜色都会匹配相应的动作。此时我就要问大家为什么会有这个动作呢?
同理,若此时存在一个进程,而信号就是一个数字(可以通过?kill -l 查看,稍后会讲),即使进程没有收到信号的时候,它也知道当收到信号的时候能够准备识别并知道该如何处理(因为程序员设计进程的时候,早就已经设计好了对信号识别处理的能力!!)?
?如果大家还是困惑我在给大家举个例子:
我们可以使用kill -l命令可以察看系统定义的信号列表。具体如下:
【解释说明】
- SIGHUP (1):?挂起信号
- SIGINT (2):?中断信号
- SIGQUIT (3):?退出信号
- SIGILL (4):?非法指令信号
- SIGTRAP (5):?跟踪/断点陷阱信号
- SIGABRT (6):?中止信号
- SIGBUS (7):?总线错误信号
- SIGFPE (8):?浮点异常信号
- SIGKILL (9):?强制杀死进程信号
- SIGUSR1 (10):?用户自定义信号 1
- SIGSEGV (11):?段错误信号
- SIGUSR2 (12):?用户自定义信号 2
- SIGPIPE (13):?管道破裂信号
- SIGALRM (14):?超时信号
- SIGTERM (15):?终止信号
- SIGSTKFLT (16):?协程栈错误信号
- SIGCHLD (17):?子进程状态改变信号
- SIGCONT (18):?继续执行信号
- SIGSTOP (19):?停止进程信号
- SIGTSTP (20):?终端停止信号
- SIGTTIN (21):?后台进程尝试读取控制终端
- SIGTTOU (22):?后台进程尝试写入控制终端
- SIGURG (23):?紧急情况信号
- SIGXCPU (24):?超过CPU时间限制信号
- SIGXFSZ (25):?超过文件大小限制信号
- SIGVTALRM (26):?虚拟定时器信号
- SIGPROF (27):?用于分析的定时器信号
- SIGWINCH (28):?窗口大小改变信号
- SIGIO (29):?异步I/O事件通知信号
- SIGPWR (30):?电源故障信号
- SIGSYS (31):?非法系统调用信号
有了上述的 知识储备之后,接下来通过简单的代码来理解信号!!!
? 演示如下:
除了上述方法之外,还可以通过【ctrl+c】的方式终止一个前台进程
【现象解释】?
【解释说明】?
相应的也有后台进程(使用 & 将进程放到后台执行)
?演示如下:
?
注意
- 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+\】
?【解释说明】
?效果演示:
综上所述,信号是进程之间事件异步通知的一种方式,属于软中断
?理解信号是软中断需要考虑计算机系统中的中断和信号两个概念。
中断:
信号是软中断:
因此综合起来,将信号称为软中断是因为它类似于硬中断的概念,但它是在软件层面实现的。信号提供了一种轻量级的通信和事件处理机制,允许进程在运行时响应各种事件,而不需要像硬中断那样涉及到硬件层面的处理。
常见信号:
以上便是本期信号概念的基本介绍。下期我将给大家介绍“信号的产生”相关知识!!!