学完信号量是否能区分进程信号和信号量
进程信号:
是一种中断机制,或者是一种事件通知机制,通过信号通知进程发生了某个事件,打断进程当前的操作去处理事件
一个信号对应一个事件,并且信号必须能够被识别
linux下信号种类:使用kill -l查看所有信号 其中 1-31号 :非可靠信号 34-64号:可靠信号 共62种
信号的生命周期:产生,注册,注销,处理
(1)产生:
- 硬件产生:Ctrl+c( 2 SIGINT) Ctrl+\( 3 SI-QUIT) Ctrl+z( 19 SIGSTOP)
- 软件产生:kill命令发送一个信号给进程 kill -signum pid
kill杀死进程的原理是给进程发送一个终止信号,进程处理信号的方式就是退出进程
接口:
- int kill(pid_t pid,int sig); 给指定进程发送指定信号
- int raise(int sig)给调用进程发送指定信号
- unsigned int alarm(unsigned int seconds);设置定时器,到时间处理事件
(2)注册:让进程能够知道自己收到了哪个信号
修改pcb中的未决信号集合位图,并且添加信号信息节点
- 未决信号集合:没有被处理的信号集合 本质上是一个位图,用于标记有哪些信号待处理
- sigqueue双向链表,用于添加信号信息节点 ,相同的节点有多少个,就表示有多少个相同信号待处理
非可靠信号:若信号没有注册则注册,已经注册则什么都不做
可靠信号:不管信号有没有注册,都会注册一次
(3)注销:删除信号痕迹(节点+位图)
- 非可靠:删除节点后直接重置位图
- 可靠:删除一个信息节点后,确定没有相同节点才会重置位图
(4)处理:打断当前进程当前操作,然后执行信息的处理函数,执行完毕后回到原来的主控流程中继续运行
处理方式:
- 默认处理方式:执行默认处理函数
- 忽略处理方式:信号依然会注册只是处理方式会变为空操作(什么都不做)
- 自定义处理方式:自己定义信号处理函数,修改信号的处理函数指针
sighandler_t signal(int signum,sighandler_t handler);
参数:signum:要修改的信号 handler:传入的处理方式;SIG_DFL/SIG_IGN/自定义函数
返回值:成功则返回原来的处理方式,失败则返回SIG_ERR
测试结果如下:
程序运行:
当程序运行的都是自己写的代码和访问都是自己的变量则程序运行在用户态
程序运行从内核态返回用户态之前去处理信号
若程序运行要访问内核空间或者说要完成内核中的功能就需要切换到内核态: 切换到内核态三种方式(1)系统调用接口 (2)中断 (3)异常
默认和忽略在内核完成处理,自定义处理需要返回用户态
则自定义处理方式的信号捕捉流程:
信号的阻塞:信号依然可以注册,只是暂时阻止信号被处理
原理:在pcb中有一个阻塞集合,如果哪个信号在这个集合中被标记,则表示这个信号要阻塞,收到了这个信号则暂时不去处理
调用接口:
int sigprocmask(int how , const sigset_t *set, sigset_t *oldset);
- how:操作类型(要对阻塞集合进行的操作)
- SIG_BLOCK:将set集合中的信号添加到阻塞集合 block |=set;
- SIG_UNBLOCK:从阻塞集合中移除set中的信号 block&=~set;
- SIG_SETMASK:将set集合中的信号设置为阻塞集合 block=set
- oldset:用于保存修改前阻塞集合中的数据,以便能够还原
测试结果如下:
在所有信号中:SIGKILL -9/SIGSTOP-19 不能被阻塞,不能被修改处理方式,不能被忽略
进程无法被杀死的情况:
1,僵尸进程
2,信号被阻塞或自定义或忽略 (SIGKILL -9/SIGSTOP-19除外)
3,进程是停止状态
信号的基本应用:
- SIGCHLD(非可靠信号):子进程退出之后给父进程发送的信号
默认处理方式:什么都不做(即忽略)
自定义SIGCHLD信号的处理方式,在信号回调函数中调用waitpid
考虑多个子进程退出,由于非可靠信号只会注册一次,其余事件丢失
解决方法:1,signal(SIGCHLD,sigcb) 在回调函数sigcb中 while(waipid(-1.NULL,WNOHANG)>0);waitpid返回值大于0表示有子进程退出,等于0表示没有子进程退出
2,signal(SIGCHLD,SIG_IGN)显式忽略 ,内部将子进程资源释放
- SIGPIPE默认处理方式是退出进程
’ 若不想退出进程,需要自定义处理
学完信号量是否能区分进程信号和信号量相关推荐
- Nginx之进程间的通信机制(信号、信号量、文件锁)
1. 信号 Nginx 在管理 master 进程和 worker 进程时大量使用了信号.Linux 定义的前 31 个信号是最常用的,Nginx 则通过重定义其中一些信号的处理方法来使用吸纳后,如接 ...
- 七点学完安全知识超级详细了解进程和病毒知识
七点学完安全知识超级详细了解进程和病毒知识 第一:进程是什么 进程为应用程序的运行实例,是应用程序的一次动态执行.看似高深,我们可以简单地理解为:它是操作系统当前运行的执行程序.在系统当前运行的执行程 ...
- Linux进程信号(产生、保存、处理)/可重入函数概念/volatile理解/SIGCHLD信号
首先区分一下Linux信号跟进程间通信中的信号量,它们的关系就犹如老婆跟老婆饼一样,没有一毛钱的关系. 信号的概念 信号的概念:信号是进程之间事件异步通知的一种方式,属于软中断.比如:红绿灯是一种信号 ...
- 进程同步控制(锁,信号量,事件), 进程通讯(队列和管道,生产者消费者模型) 数据共享(进程池和mutiprocess.Pool模块)...
参考博客 https://www.cnblogs.com/xiao987334176/p/9025072.html#autoid-1-1-0 进程同步(multiprocess.Lock.Semaph ...
- 十天学Linux内核之第二天---进程
十天学Linux内核之第二天---进程 原文:十天学Linux内核之第二天---进程 都说这个主题不错,连我自己都觉得有点过大了,不过我想我还是得坚持下去,努力在有限的时间里学习到Linux内核的奥秘 ...
- 进程间通信IPC(二)(共享内存、信号、信号量)
共享内存: 共享内存就是允许两个或多个进程共享一定的存储区.就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针.当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更 ...
- 嵌入式Linux学习经典书籍-学完你就是高手
很多刚入门的朋友一直都有人问我要学习资料,嵌入式实在太杂,网上很多人写的太不负责了,本书单综合了本人以及一些朋友多年的经验整理而成. 本人见识和阅读量有限,本书单可能有不对的地方,欢迎朋友指正,交流你 ...
- 【Linux】进程信号“疑问?坤叫算信号吗?“
鸡叫当然也算信号啦~ 文章目录 前言 一.认识信号量 二.信号的产生 1.调用系统函数向进程发信号 2.由软件条件产生信号 3.硬件异常产生信号 总结 前言 信号在我们生活中很常见,下面我们举一举生活 ...
- Linux - 第8节 - 进程信号
目录 1.Linux信号的基本概念 1.1.生活角度的信号 1.2.技术应用角度的信号 1.3.查看系统定义的信号列表 1.4.信号的处理常见方式 2.信号产生的一般方式 2.1.通过终端按键产生信号 ...
最新文章
- push、pop指令
- CentOS常用到的查看系统命令
- unistd.h 中int access(const char * pathname, int mode); 判断进程能否以mode模式访问pathname文件(可以用来判断文件/目录是否存在)...
- one order event trace - how to switch on
- 专访vivo X27产品经理:以技术进步为根 以用户需求为本
- 实战JavaScript:实现像素鸟小游戏
- 常见Excel技巧表
- python for ArcGIS 绘制杭州市板块地图
- Shell常用命令cat用法详解
- 解决新版 Edge 浏览器无法使用 IDM 的问题
- windows bat 批处理脚本编写指南
- 【毕业设计】基于大数据的招聘职业爬取与分析可视化
- 熵权法stata程序
- 华为hana服务器型号齐全,华为宣布工业服务器通过SAP HANA认证
- 系统辨识(六):最小二乘法的修正算法
- 东方财富:公司总经理陶涛辞任 其实将担任总经理职务
- MINE:Mutual Information Neural Estimation
- vlc web 登录账号_使用VLC Activex插件做网页版视频播放器
- Java-栈的基本操作
- 完全卸载docker 有效