今天,看了unp的第五章,总结一下POSIX的信号处理问题。
要处理信号首先需要知道的是什么是信号,简单的说明一下:
信号——一种由进程到进程(内核到进程)的事件通知。通常是异步发生的,也叫软中断[software interrupt](书上不知道怎么想的叫软件中断)
信号的长生者可以是 进程 或者是 内核
信号的接受者是 进程
每个信号都有他自己的行为 POSIX中通过调用sigaction函数来设定一个信号的行为,看看sigaction的定义
注:以下所有的代码基于Linux 2.6.35-24-generic 内核
函数中的第二个参数是我们必须分配并且填写的结构,也就是说我们如果要调用这个函数就必须预处理很多事情,
我们可以用signal函数来完成很多复杂的事情,需要说明的是signal函数是早于POSIX出现的函数,既然POSIX已经明确的定义了sigaction函数
调用时的信号语义,unp中的解决方法就是使用一个自己写好的signal函数来完成那些麻烦的事情。
先看看signal函数的原型:
系统为了各种兼容问题写好多版本的signal 但是仔细研究会发现最开始的typedef很给力为什么这么说,如果没有他下面的这些函数简直就比较难理解了,其实这些函数名字太一样但是传入的参数,返回的都是同样的
注:详细的定义讲解看这里
就拿其中的
typedef void (*__sighandler_t) (int);
__sighandler_t signal (int __sig, __sighandler_t __handler);
说明
函数传入两个参数:
int __sig
指出需要处理的信号,每个信号都有一个名字,每个名字是使用一个整数宏定义的,具体的定义见 /usr/include/asm-generic/signal.h 文件中的#define SIG**都是啦。
__sighandler_t __handler
是一个指向函数的指针,或者是常数值SIG_DFL和 SIG__IGN,是函数的指针大家一目了然,至于为什么能是常数就要看看这两个常数的定义了
/usr/include/asm-generic/signal-defs.h 文件定义了他们
明明就是个强制的类型转换嘛,:-)!!
有了这些基础在继续看应该不是问题了,信号的处理很复杂,简单了解一下,主要是打基础!!
个人水平所限,很多东西不一定完全正确,还请大家多多指教