信号

信号是有限形式的进程间通信中使用的Unix,类Unix和其他POSIX兼容的操作系统的。信号是一个异步发送到通知处理或特定的线程,以通知它发生事件的同一进程内。

当发送信号时,操作系统中断目标进程的正常执行的流动来传递信号。可以执行过程中的任何中断非原子指令。如果进程事先注册的信号处理程序,该程序被执行。否则,默认信号处理程序被执行。

嵌入式程序可能会发现进程间通信有用信号,作为计算和内存占用的信号很小。

系统调用发送指定的信号到指定的过程,如果权限允许。类似地,杀命令允许用户将信号发送到处理。

例外情况,如被零除或分段违例将产生信号(在这里,SIGFPE “浮点异常”和SIGSEGV “ 赛格心理状态v分别iolation”,这两者在默认情况下会导致核心转储和程序退出)。

内核可以产生信号,通知事件的过程。例如,SIGPIPE当一个进程写入到已经由读取器关闭一个管道将产生; 默认情况下,这将导致进程终止,施工时既方便外壳管道。

在键入某些组合键控制终端正在运行的进程会导致系统发送某些信号:
按Ctrl-C (在旧的Unix,DEL)发送一个INT信号(“中断”,SIGINT); 默认情况下,这将导致进程终止。
按Ctrl-Z发送TSTP信号(“终点站”,SIGTSTP); 默认情况下,这将导致程序中止执行。
按Ctrl - \发出退出信号(SIGQUIT); 默认情况下,这将导致进程终止并转储核心。
按Ctrl-T (不支持所有的UNIX)发送一个信息信号(SIGINFO); 通过默认,并且如果由命令所支持,这导致操作系统以显示有关正在运行的命令的信息。

用现代的操作系统这些默认组合键可以与被改变的stty命令。

接下来便给读者展现:

首先,我们先写一个死循环


然后


信号处理程序可以与安装信号系统调用。如果信号处理程序未安装特定的信号,则使用默认的处理程序。否则信号被截取和信号处理程序被调用。这个过程也可以指定两个默认的行为,而无需创建一个处理程序:忽略信号(SIG_IGN),并使用默认的信号处理(SIG_DFL)。有两个信号不能被拦截和处理:SIGKILL和SIGSTOP。

正如上图所示的那样,默认操作便是终止进程。,那自定义呢?又该怎么办?

首先,我们来了解一个函数


然后再写一个程序:这个程序的主要就是接收到2号信号,便跳转到handle函数



最后,我们来看看结果:


这里,你可以有三种方法实现发送信号2给程序

第一种.便是上面所说的CTRL+C

第二种.硬件产生信号

第三.便是调用kill(2)函数亦可以实现



接下来,再给大家说一种软件条件产生的信号


把上面的文件,简单修改,便可实现。

来看看,它的效果:


这个方法可以测你的计算机一秒能跑多少


读者可以试试看


接下来,我们我试试刚才的那个程序,对它是否适用,然后验证上述的正确性



在看看结果:


看来,是正确的。



信号处理是脆弱的竞争条件。作为信号是异步的,另一信号(即使是相同类型的)可以在信号处理程序的执行过程中被传递到该过程。

所述sigprocmask()执行呼叫可用于阻止和解除的信号传送。阻塞的信号不传递到这个过程,直到畅通。不能被忽略信号(SIGKILL和SIGSTOP)不能被阻止。



接下来,给大家看看这个:



接下来,我们再写个小程序


在看看结果:




信号可引起正在进行一个系统调用的中断,将其留给应用程序来管理非透明重启。

信号处理应写入的方式,不会导致任何不必要的副作用,如errno的改变,信号掩码改变,信号配置变化和其他全球性进程属性更改的非使用折返功能,例如,的malloc或printf的,内部信号处理程序也是不安全的。

信号处理器可以代替把信号转换成一个队列并立即返回。然后主线程将继续“不间断”,直到信号被从队列中取出,例如在事件循环。“不间断”在这里指操作该块可能会过早返回并必须恢复,如上所述。信号应从主线程队列由处理并没有工人池,作为重新引入异步性的问题。

与硬件异常的关系
一个进程的执行可能导致硬件的产生异常,例如,如果过程试图除以零或招致一个TLB未命中。

在类Unix操作系统,这个事件会自动更改处理器的背景下,开始执行内核 异常处理程序。在一些例外,如一个的情况下缺页,内核具有足够的信息,以充分处理该事件本身和恢复过程的执行。

其他异常,然而,内核不能智能处理和必须代替推迟异常处理操作出错进程。此延迟是通过信号机制,其中,所述内核发送到处理对应于当前异常的信号来实现的。例如,如果一个进程的上试图整数除以零的x86 CPU,一个除法错误,就可以产生异常,引起内核向发送SIGFPE信号的过程。

同样地,如果过程试图其外部访问的存储器地址的虚拟地址空间,内核将经由通知这个违反的过程SIGSEGV信号。信号名称和异常之间的精确映射显然是依赖于CPU,因为异常类型的架构不同。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值