ipcs -m : 查看共享内存
ipcs -s 查看信号量
ipcs -q 查看消息队列
删除进程间通信资源
从生活角度来讲
从技术角度
用户输入命令,在Shell下启动一个前台进程。
如下代码
从这两个角度来看,进程就是我,操作系统就是快递员,信号就是快递
注意
信号概念
用kill -l命令可以察看系统定义的信号列表
信号处理常见方式
SIGINT的默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并且Core Dump,现在我们来验证一下。
Core Dump 核心转储
当一个进程异常终止时,可以选择把进程的用户空间内存数据的全部保存到磁盘上,叫 Core Dump。进程异常终止通常因为有Bug,比如非法存访问导致段错误,事后可以用调试器检查 core 文件以查清错误原因,这就叫做Post-mortem Debug(事后调试)。一个进程允许产生多大的 Core 文件取决于进程的 resource Limit (保存在PCB里)。默认是不允许产生core文件的,因为core文件中可能包含用户密码等敏感信息,不安全。在开发调试阶段可以用ulimit命令改变这个限制,允许产生core文件。首先用ulimit命令改变Shell进程的Resource Limit,允许core文件最大为1024K:ulimit -c 1024
在后台执行死循环程序,然后用kill命令给它发SIGSEGV信号,指定发送某种信号的kill命令可以有多种写法,上面的命令还可以写成 kill -SIGSEGV 进程id 或 kill -11 进程id , 11是信号SIGSEGV的编号。以往遇 到的段错误都是由非法内存访问产生的,而这个程序本身没错,给它发SIGSEGV也能产生段错误。
还有3个系统调用函数可以实现向进程发信号,kill raise abort
kill
raise
abort
SIGPIPE是一种由软件条件产生的信号,在进程的通信的管道中已经介绍过了。本节主要介绍alarm函数和 SIGALRM信号。
调用alarm函数可以设定一个闹钟,也就是告诉内核在seconds秒之后给当前进程发SIGALRM信号, 该信号的默认处理动作是终止当前进程。
硬件异常被硬件以某种方式被硬件检测到并通知内核,然后内核向当前进程发送适当的信号。例如当前进程执行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解释 为SIGFPE信号发送给进程。再比如当前进程访问了非法内存地址,MMU会产生异常,内核将这个异常解释为SIGSEGV信号发送给进程。
模拟野指针异常
异常被捕获,并被自定义处理
由此可以确认,我们在C/C++当中除零,内存越界等异常,在系统层面上,是被当成信号处理的。
总结一下,有几个问题会在后面的知识里呈现
信号在进程的PCB里保存,用一个无符号数的位图来保存,比特位的位置代表是哪个信号,比特位的内容代表是否收到此信号,那么操作系统是如何给进程发(其实是写信号)信号的呢?kill -8 进程ID ==> 把进程里的位图的第8位改为1,那么进程执行信号的行为。
信号的相关术语
信号在内核中的表示
sigset_t
信号集操作函数
处理阻塞信号集和未决信号集的相关接口
sigprocmask : 读取或者更改进程的信号屏蔽字(阻塞信号集)
sigpending : 读取当前进程的未决信号集听过输出型参数传出
一段有意思的代码
进程信号递达的3种方式
相应的系统调用接口介绍
sigaction函数可以读取和修改与指定信号相关联的处理动作,调用成功则返回0,出错则返回- 1。signum 是指定信号的编号。若act指针非空,则根据act修改该信号的处理动作。若oact指针非 空,则通过oact传出该信号原来的处理动作。act和oact指向sigaction结构体:
结构体成员说明:将sa_handler赋值为常数SIG_IGN传给sigaction表示忽略信号,赋值为常数SIG_DFL表示执行系统默认动作,,赋值为一个函数指针表示用自定义函数捕捉信号,或者说向内核注册了一个信号处理函 数,该函数返回值为void,可以带一个int参数,通过参数可以得知当前信号的编号,这样就可以用同一个函数处理多种信号。显然,这也是一个回调函数,不是被main函数调用,而是被系统所调用。
当某个信号的处理函数被调用时,内核自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时自动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产生,那么 它会被阻塞到当前处理结束为止。 如果在调用信号处理函数时,除了当前信号被自动屏蔽之外,还希望自动屏蔽另外一些信号,则用sa_mask字段说明这些需要额外屏蔽的信号,当信号处理函数返回时自动恢复原来的信号屏蔽字。 sa_flags字段包含一些选项,代码都把sa_flags设为0,sa_sigaction是实时信号的处理函数,不详细解释这两个字段,有兴趣的小伙伴可以在了解一下。
sigaction的使用
结果和signal函数是一样的,sigaction函数的功能比signal函数丰富一些
信号是什么时候处理的呢?从内核态切换到用户态的时候
站在信号的角度理解一下 volatile
Makefile
test.c
结果
我们在看编译器优化的情况
结果
给全局变量 quit 加关键字 volatile 修饰
结果
可以得出结论
DELETEFROMTablesWHEREIDNOTIN(SELECTMin(ID)FROMTablesGROUPBYName) Min的话保...
4月11日20:30~22:00通过腾讯会议进行了第二次在线学习讨论我把学习笔记整理一下...
Elasticsearch 是通过 Lucene 的倒排索引技术实现比关系型数据库更快的过滤。特...
本文实例讲述了Laravel框架源码解析之反射的使用。分享给大家供大家参考,具体如...
复制代码 代码如下: % URL="http://news.163.com/special/00011K6L/rss_newstop....
项目中用到的一些特殊字符和图标 html代码 XML/HTML Code 复制内容到剪贴板 div ...
上篇文章给大家介绍了 Java正则表达式匹配,替换,查找,切割的方法 ,接下来,...
正则忽略大小写 – RegexOptions.IgnoreCase 例如: 复制代码 代码如下: Str = R...
错误描述: 在开发.net项目中,通过microsoft.ACE.oledb读取excel文件信息时,报...
工具:Eclipse,Oracle,smartupload.jar;语言:jsp,Java;数据存储:Oracle。...