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这种赋值,实现了多态。