unix环境高级编程之signal函数

#include<signal.h>中的signal函数用于进程对于信号的处理

其函数原型为: void ( *signal( int sig, void (* func)( int )))( int );

这个函数乍一看实在费解,就算了解函数指针的定义都感觉云里雾里,下面就对这个结构好好展开说一下:

int (*p)();
这是一个函数指针, p所指向的函数是一个不带任何参数, 并且返回值为int的一个函数.
int (*func())();
这个式子与上面式子的区别在于用func()代替了p,而func()是一个函数,所以说就可以看成是func()这个函数执行之后,它的返回值是一个函数指针,这个函数指针(其实就是上面的p)所指向的函数是一个不带任何参数,并且返回值为int的一个函数.

void (*signal(int signo, void (*func)(int)))(int);就可以看成是signal()函数(它自己是带两个参数,一个为整型,一个为函数指针的函数),而这个signal()函数的返回值也为一个函数指针,这个函数指针指向一个带一个整型参数,并且返回值为void的一个函数.

在写信号处理函数时对于信号处理的函数也是void sig_fun(int signo);这种类型,恰好与上面signal()函数所返回的函数指针所指向的函数是一样的.void ( *signal() )( int );

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

好吧,说到最后其实最外面的void () (int) 指的是函数返回值是一个void ( *signal() )( int )结构的原先该信号的处理函数,这样一切就都好理解了。

posted @ 2018-04-21 14:52  J1ac  阅读(329)  评论(0编辑  收藏  举报