linux进程信号(1)(认识信号)

文章目录

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)(认识信号) - 宋马

编号34以上的是实时信号

1.6软硬件方面理解信号

图片[2] - linux进程信号(1)(认识信号) - 宋马

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

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容