信号相关概念
我记得我在进程间通信的时候说到过一种方式——信号量;终止在linux命令行上正在运行的可执行程序所用的ctrl+c,也属于一种信号(是常见SIGINT信号),所以,今天我想具体分享一下与信号相关的一些概念。
Linux中信号共有64个,常见信号量只有31个,利用kill -l命令就可以用来查看全部信号,如下图所示:
首先从信号的处理的三种方式说起。
1>忽略信号,常见的是子进程结束是向父进程发起被父进程忽略的SIGCHLD信号(我在上一篇博客--子进程异步等待方式中有验证)。
2>执行信号的默认处理动作。
3>自定义一种对信号的处理动作。
前两种在Linux系统中,在使用signal函数对一个信号进行捕捉时,signal函数的定义如下所示:
第一个信号为待捕捉的信号编号,其中,第二个参数有三种选择,SIG_IGN表示忽略信号(在守护进程那篇博客中有运用),SIG_DFL表示执行该信号的默认动作(就不演示),自定义处理动作可以填用户自定义的函数名(在博客子进程异步等待方式中有运用)。
其次说说,信号的产生来说吧!信号的产生分为3种。
1>通过终端按键产生的信号。例如:ctrl+c,ctrl+\等等。
2>调用系统函数向进程发信号。例如:kill函数,raise函数,abort函数。
kill函数向任意进程发任意信号如下示:
raise函数向进程发SIGABRT信号如下示:
abort函数向函数所在的进程发任意信号如下示:
3>由软件条件产生信号。例如:alarm函数。
alarm函数发信号如下示:
程序收到闹钟会结束程序
在前一个alarm函数没执行完时,重新设置alarm函数,该alarm函数返回上一alarm函数剩余秒数。
最后,需要明确的一点是向进程发送的信号并不会第一时间抵达并被进程处理,所以信号存在信号未决和信号抵达这两种状态。
下一个博客会具体说明信号屏蔽以及如何实现信号屏蔽。敬请期待!
PS:个人不喜欢文字太多和太长的技术性文章,所以我分成两个博客,内容衔接,时间也会接近,不会影响阅读的。希望大家能喜欢,如有错误,请斧正!