signal 和 signaction 函数的基础

时间:2021-03-19 00:12:36

今天,看了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 文件定义了他们

 

明明就是个强制的类型转换嘛,:-)!!

 

有了这些基础在继续看应该不是问题了,信号的处理很复杂,简单了解一下,主要是打基础!!

个人水平所限,很多东西不一定完全正确,还请大家多多指教