文章目录
1.1生活角度1.2技术角度的信号1.3一个系统函数1.4信号概念1.5查看信号1.6软硬件方面理解信号1.7系统调用信号,以及闹钟
1.1生活角度
你在⽹上买了很多件商品,再等待不同商品快递的到来。但即便快递没有到来,你也知道快递来临
时,你该怎么处理快递,也就是你能“识别快递”。
当快递员到了你楼下,你也收到快递到来的通知,但是你正在打游戏,需5min之后才能去取快递。
那么在在这5min之内,你并没有下去去取快递,但是你是知道有快递到来了。也就是取快递的⾏为
并不是⼀定要⽴即执⾏,可以理解成“在合适的时候去取”。
在收到通知,再到你拿到快递期间,是有⼀个时间窗⼝的,在这段时间,你并没有拿到快递,但是
你知道有⼀个快递已经来了。本质上是你“记住了有⼀个快递要去取”
当你时间合适,顺利拿到快递之后,就要开始处理快递了。
⽽处理快递⼀般⽅式有三种:
1.执⾏默
认动作(幸福的打开快递,使⽤商品)
2.执⾏⾃定义动作(快递是零⻝,你要送给你你的⼥朋友)
3. 忽略快递(快递拿上来之后,扔掉床头,继续开⼀把游戏)
快递到来的整个过程,对你来讲是异步的,你不能准确断定快递员什么时候给你打电话
怎么识别信号?
识别信号是内置的,进程识别信号,是内核程序员写的内置特性。
信号产⽣之后,你知道怎么处理吗?知道。如果信号没有产⽣,你知道怎么处理信号吗?
知道。所以,信号的处理⽅法,在信号产⽣之前,已经准备好了。
处理信号,⽴即处理吗?
我可能正在做优先级更⾼的事情,不会⽴即处理?什么时候?
合
适的时候。
信号到来|信号保存 |信号处理
怎么进⾏信号处理啊?a.默认b.忽略c.⾃定义,后续都叫做信号捕捉
1.2技术角度的信号
#include <iostream>
#include <unistd.h>
int main()
{
while(true){
std::cout << "I am a process, I am waiting signal!" << std::endl;
sleep(1);
}
}
$ g++ sig.cc -o sig
$ ./sig
I am a process, I am waiting signal!
I am a process, I am waiting signal!
^C
⽤⼾输⼊命令,在Shell下启动⼀个前台进程
⽤⼾按下Ctrl+C
这个键盘输⼊产⽣⼀个硬件中断,被OS获取,解释成信号,发送给⽬标前台进程
前台进程因为收到信号,进⽽引起进程退出
1.3一个系统函数
NAME
signal - ANSI C
signal handling
SYNOPSIS
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
参数说明:
signum:信号编号
[后⾯解释,只需要知道是数字即可]
handler:函数指针,表⽰更改信号的处理动作,当收到对应的信号,就回调执⾏handler⽅法
⽽其实,Ctrl+C 的本质是向前台进程发送SIGINT 即2号信号,我们证明⼀下,这⾥需要引⼊⼀个系统调⽤函数
#include <iostream>
#include <unistd.h>
#include <signal.h>
void handler(int signumber)
{
std::cout << "我是: " << getpid() << ", 我获得了⼀个信号: " << signumber << std::endl;
}
int main()
{
std::cout << "我是进程: " << getpid() << std::endl;
signal(SIGINT/*2*/, handler);
while(true){
std::cout << "I am a process, I am waiting signal!" << std::endl;
sleep(1);
}
}
下面是执行的命令
$ g++ sig.cc -o sig
$ ./sig
我是进程: 212569
I am a process, I am waiting signal!
I am a process, I am waiting signal!
^C
我是: 212569,
我获得了⼀个信号: 2
I am a process, I am waiting signal!
I am a process, I am waiting signal!
^C
我是: 212569, 我获得了⼀个信号
: 2
I am a process, I am waiting signal!
I am a process, I am waiting signal!
这⾥进程为什么不退出?
这个例⼦能说明哪些问题?
信号处理,是⾃⼰处理
请将⽣活例⼦和Ctrl-C 信号处理过程相结合,解释⼀下信号处理过程?
进程就是你,操作系统就是快递员,信号就是快递,发信号的过程就类似给你打电话
要注意的是,signal函数仅仅是设置了特定信号的捕捉⾏为处理⽅式,并不是直接调⽤处理动作。如果后续特定信号没有产⽣,设置的捕捉函数永远也不会被调⽤!!
Ctrl-C 产⽣的信号只能发给前台进程。⼀个命令后⾯加个&可以放到后台运⾏,这样Shell不必等待进程结束就可以接受新的命令,启动新的进程。
Shell可以同时运⾏⼀个前台进程和任意多个后台进程,只有前台进程才能接到像这种控制键产⽣的信号。
前台进程在运⾏过程中⽤⼾随时可能按下Ctrl-C,Ctrl-C ⽽产⽣⼀个信号,也就是说该进程的⽤⼾空间代码执到任何地⽅都有可能收到SIGINT 信号⽽终⽌,所以信号相对于进程的控制流程来说是异步(Asynchronous)的。

1.4信号概念
信号是进程之间事件异步通知的⼀种⽅式,属于软中断
1.5查看信号
![图片[1] - linux进程信号(1)(认识信号) - 宋马](https://pic.songma.com/blogimg/20251130/b1f34f07f0a14bca8b1eeed52e7c06dc.png)

编号34以上的是实时信号
1.6软硬件方面理解信号
![图片[2] - linux进程信号(1)(认识信号) - 宋马](https://pic.songma.com/blogimg/20251130/63c934ec6d9e4024ac40cfddc49ae480.png)

1.7系统调用信号,以及闹钟




















暂无评论内容