当前位置:   article > 正文

signal函数详解_请描述signal函数间接调用的自定义函数sig_handler为什么需要一个int型参数(

请描述signal函数间接调用的自定义函数sig_handler为什么需要一个int型参数(

 

 

 

c traps and pitfalls 对signal函数解释得非常详细。

 

<signal.h> 中

 

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 <signal.h>

#include <unistd.h>

#include <stdio.h>

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-发出。该程序执行的结果如下:

localhost:~$ ./sig_test

process id is 463

Get a signal -SIGINT //按下Ctrl-C得到的结果

Get a signal -SIGQUIT //按下Ctrl-得到的结果

//按下Ctrl-z将进程置于后台

[1]+ Stopped ./sig_test

localhost:~$ bg

[1]+ ./sig_test &

localhost:~$ kill -HUP 463 //向进程发送SIGHUP信号

localhost:~$ Get a signal – SIGHUP

kill -9 463 //向进程发送SIGKILL信号,终止进程

localhost:~$

来自: http://hi.baidu.com/flikecn/blog/item/aa295403302bf29ad53f7c31.html

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/460179
推荐阅读
相关标签
  

闽ICP备14008679号