信号处理之signal 函数笔记

表头文件 #include<signal.h>

功 能: 设置某一信号的对应动作

函数原型 :void (*signal(int signum,void(* handler)(int)))(int);

或者:typedef void(*sig_t) ( int );

sig_t  signal ( int signum ,  sig_t  handler);    (sig_t  表示 “指向函数的指针” 这一种数据类型)

参数说明:

第一个参数signum指明了所要处理的信号类型,它可以取除了SIGKILL和SIGSTOP外的任何一种信号。

第二个参数handler描述了与信号关联的动作,它可以取以下三种值:

(1)一个返回值为正数的函数地址

此函数必须在signal()被调用前申明,handler中为这个函数的名字。当接收到一个类型为sig的信号时,就执行handler 所指定的函数。这个函数应有如下形式的定义:

int func(int sig);

sig是传递给它的唯一参数。执行了signal()调用后,进程只要接收到类型为sig的信号,不管其正在执行程序的哪一部分,就立即执行func()函数。当func()函数执行结束后,控制权返回进程被中断的那一点继续执行。

(2)SIGIGN

这个符号表示忽略该信号,执行了相应的signal()调用后,进程会忽略类型为sig的信号。

(3)SIGDFL

这个符号表示恢复系统对信号的默认处理。

理解:

重要是理解指向函数的指针,其一般定义形式为:  数据类型 ( * 指针变量名 )( 函数参数表列 )

void ( *signal() )( int );

signal是一个函数, 它返回一个函数指针, 后者所指向的函数接受一个整型参数 且没有返回值, 仔细看, 是不是siganal( int signo, void (*handler)(int) )的第2个参数了, 对了, 其实他所返回的就是 signal的第2个信号处理函数, 指向信号处理函数, 就可以执行函数了( signal内部时, signal把信号做为参数传递给handler信号处理函数, 接着 signal 函数返回指针, 并且又指向信号处理函数, 就开始执行它)

其实调用signal函数时只是给第一个参数一个信号量,然后signal 函数通过此信号量得到一个int类型值,再传给signal第二个参数(即信号处理函数)去执行。

 

 

参考:百科 http://baike.baidu.com/view/64630.htm

博客 http://blog.sina.com.cn/s/blog_6038fae80100mmmr.html

posted @ 2011-12-16 23:48  maliqian  阅读(779)  评论(0编辑  收藏  举报