linux环境编程-IPC【signal信号机制】

前面我们介绍了 IPC的 两种,现在接收另一种 signal 【信号机制】,先来看个视频了解一下

是我

一.信号的概念

  • 我们先来通俗的介绍一下信号【方便大家更好的理解】,如:古代战争中的狼烟,信号弹;体育比赛中使用的信号枪.....他们的共性:1.简单,2.不携带大量的信息,3.满足某个特定的条件才放松。
  • 信号是信息的载体,linux/UNIX环境下,古老,经典的通讯方式,现在依然是主要的通信手段。
  • Unix早期版本就提供了信号机制,但不可靠,信号可能丢失,Berkeley和AT&T都对信号模型做了更动,增加了可靠的信号机制。但彼此不兼容,POSIX.1对可靠信号例程进行了标准化。

二.信号的机制【其实信号还是有很强的不稳定性(后面我们在分一篇讲解时序竞态)】

  • A给B发送信号,B收到信号之前执行自己的代码,收到信号之后,不管执行到程序的什么位置,都要停止运行,去处理信号,处理完毕之后在继续执行,与硬件中断类似属于--异步模式,但信号是软件层面上实现的中断,早期常被称为”软中断“
  • 信号的特质:由于信号是通过软件方法实现的,其实现手段导致信号有很强的延迟性。但对于用户来说,这个延迟的时间非常的短,不容易察觉。
  • 每个进程收到的所有信号,都由内核负责发送和处理。

三.与信号相关的事件和状态

1.产生信号: 

  • 按键产生:如:Ctrl+c【SIGINT(终止  2)】, Ctrl+z【SIGTSTP(暂停 20)】,Ctrl+/【SIGQUIT(退出 3)】
  • 系统调用产生:如:kill,raise,abort
  • 软件条件产生:如:  alarm
  • 硬件异常产生:如:非法访问内存(段错误)【SIGSEGV 11】,除0(浮点数例外)【SIGFPE 8】,内存对齐出错(总线错误)【SIGBUS】
  • 命令产生:如:kill

2.递达:递送并且到达进程

3.未决:产生和抵达之间的状态,主要由于阻塞(屏蔽)导致该状态。

4.信号的处理方式:

  • 执行默认动作
  • 忽略(丢弃)【这里的忽略并不是不处理(类似404一样,虽然找不到相应的资源,但是还是要返回一个404的页面)】
  • 捕捉(调用用户的处理函数)

四.信号的原理

1.流程 

2.未决信号集和信号屏蔽字的原理图

未决信号:没有内核被处理的信号

阻塞信号:就是不能到达的信号(就是屏蔽掉的信号)

3.前面的数字表示信号的编号

与变量的三要素类似的,每个信号都有自己的4要素:1.编号,2.名称,3.事件,4.默认处理动作

可以查看:/usr/src/linux-4.1.14/arch/s390/include/uapi/asm/signal.h【32及后面的都是硬件的信号(有关嵌入式的)】

或者通过命令查看也是可以的 

五.信号的默认处理动作

  • Term:终止进程
  • lgn:忽略信号(默认即使对该中信号进行忽略)
  • Core:终止进程,生成Core文件,(检查进程死亡的原因,用于调试)
  • Stop:停止(暂停)进程
  • Cont:继续运行进程

注意:从man 7 signal 帮助文档中可以看到: The signals SIGKILL and SIGSTOP cannot be caught, blocked, or ignored.

这里特别强调SIGKILL 和 SIGSTOP 信号,是不可以捕捉或者阻塞,还有忽略的【为什么呢?如果别人有一个病毒程序,规避了所有的信号,你就没有办法处理它,它就睡一直运行,这样处理 给 操作系统留了一手处理这些恶意的程序】。

另外要清楚一点,只有信号所对应的事件发生了,该信号才会被递送(但不一定到了那个接收信号的进程),不应该乱发信号。

六.信号的中文解释【我只解释了软件层实现的信号】

1) SIGHUP:当用户退出shell时,由该shell 启动的所有进程将收到这个信号,默认动作为终止进程
2) SIGINT:当用户按下了<Ctrl+C>组合键时,用户终端向正在运行中的由该终端启动的程序发出此信号。默认动作为终止进程。
3) SIGQUIT:当用户按下<ctrl+\>组合键时产生该信号,用户终端向正在运行中的由该终端启动的程序发出些信号。默认动作为终止进程。
4) SIGILL: CPU 检测到某进程执行了非法指令。默认动作为终止进程并产生core 文件
5) SIGTRAP:该信号由断点指令或其他trap 指令产生。默认动作为终止里程并产生core文件。
6) SIGABRT:调用abort函数时产生该信号。默认动作为终止进程并产生core文件。
7) SIGBUS:非法访问内存地址,包括内存对齐出错,默认动作为终止进程并产生core文件。
8) SIGFPE:在发生致命的运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为0等所有的算法错误。默认动作为终止进程并产生core文件。
9) SIGKILL:无条件终止进程。本信号不能被忽略,处理和阻塞。默认动作为终止进程。它向系统管理员提供了可以杀死任何进程的方法。
10) SIGUSE1:用户定义的信号。即程序员可以在程序中定义并使用该信号。默认动作为终止进程。
11) SIGSEGV:指示进程进行了无效内存访问。默认动作为终止进程并产生core文件。
12) SIGUSR2:另外一个用户自定义信号,程序员可以在程序中定义并使用该信号。默认动作为终止进程。
13) SIGPIPE: Broken pipe向一个没有读端的管道写数据。默认动作为终止进程。
14) SIGALRM:定时器超时,超时的时间由系统调用alarm设置。默认动作为终止进程。
15) SIGTERM:程序结束信号,与SIGKILL不同的是,该信号可以被阻塞和终止。通常用来要示程序正常退出。执行shell命令Kill时,缺省产生这个信号。默认动作为终止进程。
16) SIGSTKFLT: Linux 早期版本出现的信号,现仍保留向后兼容。默认动作为终止进程。
17) SIGCHLD:子进程结束时,父进程会收到这个信号。默认动作为忽略这个信号。
18) SIGCONT:如果进程已停止T则使其继续运行。默认动作为继续/忽略。
19) SIGSTOP:停止进程的执行。信号不能被忽略,处理和阻塞。默认动作为暂停进程。
20) SIGTSTP:停止终端交互进程的运行。按下<ctrl+z>组合键时发出这个信号。默认动作为暂停进程。
21) SIGTTIN:后台进程读终端控制台。默认动作为暂停进程。
22) SIGTTOU:该信号类似于SIGTTIN,在后台进程要向终端输出数据时发生。默认动作为暂停进程。
23) SIGURG:套接字上有紧急数据时,向当前正在运行的进程发出些信号,报告有紧急数据到达。如网络带外数据到达,默认动作为忽略该信号。
24) sIGXCPU;进程执行时间超过了分配给该进程的CPU时间,系统产生该信号并发送给该进程。默认动作为终止进程。
25) SIGXFSZ:超过文件的最大长度设置。默认动作为终止进程。
26) SIGVTALRM:虚拟时钟超时时产生该信号。类似于SIGALRM,但是该信号只计算该进程占用CPU的使用时间。默认动作为终止进程。
27) SGIPROF:类似于SIGVTALRM,它不公包括该进程占用CPU时间还包括执行系统调用时间。默认动作为终止进程。
28) SIGWINCH:窗口变化大小时发出。默认动作为忽略该信号。
29) SIGIO:此信号向进程指示发出了-一个异步10事件。默认动怍为忽略。
30) SIGPWR:关机。默认动作为终止进程。
31)SIGSYS:无效的系统调用。默认动作为终止进程并产生core文件。

 

下一篇讲解产生信号函数的用法

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值