LINUX 信号概念

  • 格式:doc
  • 大小:25.00 KB
  • 文档页数:2

LINUX,UNIX信号概念
“信号”是LINUX,UNIX特有的一种进程间通讯方式。

一个进程可以给自已或其它进程发信号,以便控制自已或其它进程的行为。

信号来源是由某些系统调用函数、键盘操作、硬件故障、系统异常产生。

每个进程都有一个“信号数据结构”保存发给它的信号、处理方式描述、屏蔽码。

“信号数据结构”是进程控制块(PCB,linux 叫任务结构TS)的几个字段。

当进程执行完系统调用从系统态返回用户态前、或被调度时、或状态转换时,都可以查看自已的“信号数据结构”,确定有哪些信号需要处理,有的信号必需处理,有的信号可以屏蔽。

具体的信号处理过程是对软中断的模拟。

信号的产生、存储、处理是异步的。

对于在80386下开发的LINUX0.11版本来说,支持32种信号(可以用一个32位无符号整数来描述)。

相对于其他的进程间通信方式(IPC),比如说pipe, shared memory)来说,信号所能传递的信息比较粗糙,只是一个整数。

但正是由于传递的信息量少,信号也便于管理和使用。

信号因此被经常地用于系统管理相关的任务,比如通知进程终结、中止或者恢复等等。

附:教材第5章 signal.c程序难度较大,提供一点入门资料。

如果同学能结合这个程序,理解函数指针的用法,对提高C语言水平有较大帮助
linux的每个信号都有默认的处理函数,但应用程序员可以重新定义信号处理函数,这是多态。

怎么实现呢?利用函数指针。

函数指针:是一个指向某个函数入口的地址,这实际上是C语言版的运行时多态---先定义一个函数指针,然后用不同的函数为它赋值,得到不同函数的运行结果。

伪代码示例:
int x;
int (*p) (…); 定义函数指针,该指针的类型是返回为int的函数int fun1(….){};
int fun2(….){};
int fun3(…..){};
p=fun1; x=(*p)(…); 函数名是函数的入口地址
p=fun2; x=(*p)(…);
p=fun3; x=(*p)(…);
实际上,面向对象语言编译器对运行时多态的实现,就是利用函数指针数组。

linux的信号处理比上述伪代码又进了一步,它利用函数指针做函数参数,省却了上述伪代码p=fun1这种赋值,实现了多态。