网站源码下载搭建,北京发布最新公告,同学录网站开发实现基本要求,贵州微网站建设公司1. 什么是信号 信号本质是一种通知机制#xff0c;用户or操作系统通过发送信号通知进程#xff0c;进程进行后续处理 在日常生活中就有很多例子#xff0c;比如打游戏方面王者荣耀的“进攻”#xff0c;“撤退”#xff0c;“请求集合”#xff0c;“干得漂亮#xff01…1. 什么是信号 信号本质是一种通知机制用户or操作系统通过发送信号通知进程进程进行后续处理 在日常生活中就有很多例子比如打游戏方面王者荣耀的“进攻”“撤退”“请求集合”“干得漂亮”.......这些就是信号用来通知队友传递某种信息并采取行动。
信号主要具有以下特点
进程必须具有 “识别” 的能力认识后续动作进程能够 “识别” 是程序员赋予的信号的产生是随机的可能在任意时间信号被识别后可能不会立即处理进程会临时记录信号方便后续处理至于在什么时候处理合适的时候还在写信号的产生相对于进程是异步的
2. 信号怎么产生的
信号的产生方式有四种
键盘ctrlc系统调用接口kill命令软件异常闹钟硬件异常除0错误野指针 或是命令或是异常错误最终都是由OS接收到这些指令或者识别到某些错误进而向进程PCBtask_struct发送信号
kill -l
查看信号的种类 Linux一共有62种信号没有3233其中 [1, 31] 是普通信号[33, 64] 是实时信号这里主要介绍普通信号 这一块具体内容放在下一篇博客
3. 信号处理方式
信号的处理方式有以下三种
默认进程自带程序员写好了忽略自定义捕捉 其中在 signal.h 头文件下定义了以SIG开头的一系列宏对应信号的编号 并且typedef了一个函数指针类型sighandler参数为int返回值为void 分别对应着错误默认和忽略 signal函数介绍 函数作用 自定义信号处理方式以达到信号捕捉。通过函数回调的方式修改对应的信号的处理动作。 参数 signum修改的信号编号可以传SIGINT也可以传2 handler函数的地址实现一个函数作为信号的处理动作 void handlerint args调用时signum会作为args传入 返回值不重要 当一个信号的处理方式是默认那么信号会根据下面这张表格处理 Team终止Ign忽略Core 终止 核心转储 Stop暂停Cont继续 当一个信号的处理方式是忽略则什么都不会发生 当一个信号的处理方式是自定义会按照自定义的方式执行自定义的函数如signal函数的handler 拓展
Core Dump核心转储当进程出现某种异常OS会把进程在内存中的核心相关数据转存到磁盘上在当前目录下生成core.pid的文件。目的是为了方便调试。 在我们之前的学习中父进程等待子进程退出status中 标志位为1标识发生核心转储反之没有
如何利用core文件调试
条件当前生产环境打开core dump功能并且程序在编译时-g了Debug模式进程发生了核心转储gdb 运行core-file core.pidcore文件 就可以定位到出错位置
注意一般而言在云服务器上core dump一般是关闭的因为如果一直核心转储会消耗大量空间打开只需要 ulimit -a 查看 ulimit -c 10240你认为合适的大小0 是关闭 4. 信号的发送的本质 进程如何保存信号其实在进程PCBtask_struct中有一个位图Bitmap来标识信号是否产生如果产生就标1没有就标0 关于信号保存会在后面的博客具体谈 信号发送的本质就是OS向目标进程写信号修改PCB中的指定位图结构
完