信号
初学linux,为方便使用写的,如有问题,请多多指教。
-
简介:
信号是linux系统为了响应某些状况而产生的事件。进程收到信号后应该采取相应的动作
Kill -l 可以查看现在的信号量;
(2) SIGINT ctrl +c 终止信号
(3) ctrl +\ 暂停信号,放入后台
(4) 非法指令
(5) abort 进程异常终止
(7) SIGBUS (虚实关系建立) 总线错误(从写的位置到物理内存,操作系统没有将磁盘的开始位置到物理内存之间建立 联系 mmap(把虚拟内存和磁盘文件的关系映射起来,如果磁盘大小大于0,就建立这种关系
(9) SIGKILL kill - 9 pid 杀死进程
(11) SIGSEGV 段错误
(13) 管道破裂
(14)闹钟
(15) 缺省终止某个进程,终止掉
(17)子进程死的时候会给父进程发送这个信号
(19)进程暂停
(23) SIGURG 紧急数据
(29) 异步 IO
在/usr/include/bits/signum.h 从编程的角度下说明每个信号:
-
函数:
头文件<signal.h>
第一个参数是信号的编号,第二个参数就是对于这个信号的响应方式。
响应方式有:1.默认 SIG_DFL 2.忽略 SIG_IGN 3.自定义 自定义的函数名。
-
信号的简单使用:
-
第一个,修改2号信号SIGINT(即 ctrl+c)
在这个代码中,我们使用了signal()函数,修改了信号SIGINT的响应方式,对于代码23号,但是不影响我们程序的正常使用,程序不会因此而阻塞,只有系统检测到这个信号的时候,才会产生中断。我们第一遍修改了这个信号的响应方式,使的他打印了1,当第二次的时候,我们就信号的响应方式改回了默认方式,因此出现了如上的结果。
如果想要改变三次的话,我们可以在写一个自定义函数,然后改变函数的指向。如上图屏蔽的代码,如果是更多的话,可以以此类推,套娃行为,并且最后一次修改的结果毁一直保存到程序结束的时候。
-
当我们的子进程先于父进程退出的时候,会产生孤儿进程,当然这个时候就产生一个SIGCHLD信号,我们可以铺捉这个信号,来处理这个孤儿进程。