一.信号入门-从生活角度理解信号:
当我们点完外卖后,外卖小哥会接单,商家会开始准备。然而,我们在点完外卖后只需等待外卖送达门口,而无需关心送达的具体过程,这便形成了与外卖小哥的异步关系。外卖送达后,通过电话或门铃等信号通知我们,但我们不一定会立即处理这个信号。我们可能会选择稍后处理,届时可以选择取餐并享用,或者取餐但不吃,甚至完全忽略这个信号(什么也不做)。这就是对信号的处理。在处理信号之前,还涉及到信号的保存问题。
---
二.从技术角度理解信号:2.1键盘Ctrl+c生成信号:当我们启动一个shell进程并运行一个死循环程序时,若想终止这个进程(前台进程),我们可以通过键盘按下Ctrl+c(即2号信号,SIGINT)来实现。具体过程如下:
1.键盘按下Ctrl+c组合键,触发一个中断。
2.这个中断被操作系统捕获,CPU的引脚可以检测到这一变化,操作系统随后获取这一信息。
3.操作系统向进程发送信号。
发送信号的本质:修改进程PCB中的pending位图。
注意:Ctrl+c无法终止后台进程。
---
三.前台进程与后台进程
前台进程 | 在终端或用户界面中运行 |
---|---|
后台进程 | 不占用用户的终端 |
3.1前台进程的产生方式与特点:
3.2后台进程的产生方式与特点:
3.3关于前台进程和后台进程的命令:
fg //将后台进程移到前台运行。 bg //让暂停的后台进程继续在后台运行。 jobs //查看前后台进程的信息。
---
四.信号的分类
4.1使用kill -l查看所有信号:信号的分类如下,这些是定义的宏,使用数字表示也是一样的。
对于34号及以后的信号为实时信号,我们这里不讨论。主要研究的是34号以下的1到31号信号。这31个信号可以用一个int位图表示。
我们使用的信号包括:
4.2信号的终止:信号终止一般分为core和term两种方式。在man 7 signal中会有详细介绍,指出是core终止还是term终止进程。
core和term终止进程基本相似,唯一区别是:如果进程发生core终止,可能会生成core文件。
但必须先将core file的大小设置为大于0,才能生成core文件!!!
---
五.信号处理的常见方式
5.1信号处理的方式有三种:
5.2对信号进行自定义处理:用于自定义处理信号的函数是:
函数解释:
typedef void (*sighandler_t)(int);
它的类型是一个返回值为void,参数为int的函数指针。
也可以传递这些参数:
5.3对signal的应用:我们可以通过命令行参数,在shell命令行中对指定的信号进行指定的修改。
还可以通过for循环对31个信号的执行方式进行修改。这样,操作系统发送给我们程序进程的终止信号就不起作用了。
那么我们的进程是否就无法被终止了呢?
答案:9号信号(SIGKILL)是不允许我们进行修改的,它的行为始终是终止进程。因此我们的进程肯定是可以被终止的。
以下是关于signal的应用示例:
#include <iostream> #include <unistd.h> #include <signal.h> #include <stdlib.h> #include <string.h> void Handler(int signo){ std::cout << "Received signal: " << signo << std::endl; } int main(){ struct sigaction act; memset(&act, 0, sizeof(act)); act.sa_handler = Handler; sigaction(SIGINT, &act, NULL); while(1){ sleep(1); } return 0; }
文章到此基本结束。作为C++程序员,请保持持续学习,每天进行算法练习!欢迎大家与我一起交流问题,共同进步。
???????????????
以上就是【Linux课程学习】:第20弹---信号入门专题(基础部分)的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号