【Linux】进程间通信之信号篇

今天我们来看进程间通信中唯一的异步通信机制-----> 信号
我们之前看过信号量,信号量的本质是一个计数器;千万不要跟今天的信号搞混,Linux中的信号是向进程异步发送的事件通知,通知进程有事件(硬件异常、程序执行异常、外部发出信号)发生。
进程间可以相互发送信号,内核也可能在内部发送信号。 当信号产生时,内核向进程发送信号(在进程所在的进程表项的信号域设置对应于该信号的位图的比特位为0或者为1) ,由于每个信号只保存为一位,因此不能对给定类型的信号进行排队。。内核处理一个进程收到的信号的时机是在一个进程从内核态返回到用户态时,当一个进程在内核态运行时,软中断信号并不立即起作用,要等到将返回用户态时才处理,进程只有处理完信号才会返回用户态,进程在用户态下不会有未处理完的信号。内核为每个进程维护一个(未处理)的信号队列,信号产生后首先被放入到未决队列中,如果进程选择阻塞信号,那么如果某个进程发生多次,未决信号发生多次,未决队列中进仅保留相同的信号(不可靠的信号)中的一个,而可靠信号则会被保留。
kill -l 命令查看系统定义的信号列表,每个信号都有一个编号和一个宏定义名称,这些宏定义在signal.h中
这些信号各自在什么条件下产生,默认的处理动作是什么,在signal(7)中都有详细说明,命令:man 7 signal
信号产生的方式:
1、用户在终端按下某些键时,终端驱动程序会发送信号给前台进程,例如Ctrl-C产生SIGINT信号,Ctrl-\产生SIGQUIT信号,Ctrl-Z产生SIGTSTP信号(可使前台进程停止)。
2、硬件异常产生信号,这些条件由硬件检测到并通知内核,然后内核向当前进程发送适当的信号。例如当前进程执行了除以0的指令,CPU的运算单元会产生异常,内核将这个异常解 为SIGFPE信号发送给进程。再比如当前进程访问了非法内存地址,,MMU会产⽣生异常,内核将这个异常解释为SIGSEGV信号发送给进程。
3、一个进程调用kill(2)函数可以发送信号给另一个进程。 可以用kill(1)命令发送信号给某个进程,kill(1)命令也是调用kill(2)函数实现的,如果不明确指定信号则发送SIGTERM信号,该信号的默认处理动作是终止进程。当内核检测到某种软件条件发生时也可以通过信号通知进程,例如闹钟超时产生SIGALRM信号,向读端已关闭的管道写数据时产生SIGPIPE信号。 如果不想按默认动作处理信号,用户程序可以调用sigaction(2)函数告诉内核如何处理某种信号。
4、由软件条件产生
处理信号的方式(简单记忆:忽略、默认、自定义)
1、忽略此信号;
2、执行默认处理动作;
3、提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉一个信号;
信号的产生
(1)通过终端按键产生信号
(2)通过系统函数向进程发送信号
(3)由软件条件产生信号
接下来,我们就来一一看一下信号是怎么产生的emm~~~
1、通过终端按键产生信号
我们前面也说了Ctrl-C产生SIGINT信号,Ctrl-\产生SIGQUIT信号,Ctrl-Z产生SIGTSTP信号(可使前台进程停止);
SIGINT的默认处理动作是终⽌止进程,SIGQUIT的默认处理动作是终止进程并且Core Dump,接下来我们来看一下~
什么是Core Dump?
当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部保存到磁盘上,文件名通常是core,这叫做Core Dump。
进程异常终止通常是因为有Bug,比如非法内存访问导致段错误,事后可以用调试器检查core文件以查清错误原因,这叫做Post-mortem Debug(事后调试)。
一个进程允许产生多大的core文件取决于进程的Resource Limit(这个信息保存 在PCB中)。默认是不允许产生core文件的,因为core文件中可能包含用户密码等敏感信息,不安全。在开发调试阶段可以用ulimit命令改变这个限制,允许产生core文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值