表头文件 #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