重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
signal函数是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
成都创新互联拥有网站维护技术和项目管理团队,建立的售前、实施和售后服务体系,为客户提供定制化的成都做网站、网站设计、外贸营销网站建设、网站维护、达州电信机房解决方案。为客户网站安全和日常运维提供整体管家式外包优质服务。我们的网站维护服务覆盖集团企业、上市公司、外企网站、成都做商城网站、政府网站等各类型客户群体,为全球近1000家企业提供全方位网站维护、服务器维护解决方案。
c traps and pitfalls 对signal函数解释得非常详细。
void ( *signal( int sig, void (* handler)( int ))) ( int );
int (*p)();
这是一个函数指针, p所指向的函数是一个不带任何参数, 并且返回值为int的一个函数.
int (*fun())();
这个式子与上面式子的区别在于用fun()代替了p,而fun()是一个函数,所以说就可以看成是fun()这个函数执行之后,它的返回值是一个函数指针,这个函数指针(其实就是上面的p)所指向的函数是一个不带任何参数,并且返回值为int的一个函数.
void (*signal(int signo, void (*handler)(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
函数返回指针, 并且又指向信号处理函数, 就开始执行它)
那么,signal函数的参数又是如何呢?signal函数接受两个参数:一个整型的信号编号,以及一个指向用户定义的信号处理函数的指针。我们此前已经定义了指向用户定义的信号处理函数的指针sfp:
void (*sfp)(int); |
sfp 的类型可以通过将上面的声明中的sfp去掉而得到,即void (*)(int)。此外,signal函数的返回值是一个指向调用前的用户定义信号处理函数的指针,这个指针的类型与sfp指针类型一致。因此,我们可以如下声明signal函数:
void (*signal(int, void(*)(int)))(int); |
同样地,使用typedef可以简化上面的函数声明:
typedef void (*HANDLER)(int); HANDLER signal(int, HANDLER); |
下面来看一个简单的例子:
#include#include #include void sigroutine(int dunno) { /* 信号处理例程,其中dunno将会得到信号的值 */ switch (dunno) { case 1: printf("Get a signal -- SIGHUP\n "); break; case 2: printf("Get a signal -- SIGINT\n "); break; case 3: printf("Get a signal -- SIGQUIT\n "); break; } return; } int main() { printf("process id is %d\n ",getpid()); signal(SIGHUP, sigroutine); //* 下面设置三个信号的处理方法 signal(SIGINT, sigroutine); signal(SIGQUIT, sigroutine); for (;;) ; }
其中信号SIGINT由按下Ctrl-C发出,信号SIGQUIT由按下Ctrl-发出。该程序执行的结果如下:
[zcm@t #29]$make gcc -g -c -o a.o a.c gcc -g -o a a.o [zcm@t #30]$./a process id is 7666 ^C Get a signal -- SIGINT ^Z [1]+ Stopped ./a [zcm@t #31]$ps aux|grep ./a root 1164 0.0 0.0 13320 748 ? S看完上述内容,你们掌握signal函数是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!
文章名称:signal函数是什么
地址分享:http://cqcxhl.com/article/jscecd.html