用户空间的signal函数说明
来源:互联网 发布:卡西欧回收骗局淘宝 编辑:程序博客网 时间:2024/06/08 03:23
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 <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;
}
printf("process id is %d/n ",getpid());
signal(SIGHUP, sigroutine); //* 下面设置三个信号的处理方法
signal(SIGINT, sigroutine);
signal(SIGQUIT, sigroutine);
for (;;) ;
}
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:~$
- 用户空间的signal函数说明
- signal函数说明
- signal函数说明
- signal函数说明
- signal函数说明
- signal()函数说明
- signal 函数的使用
- signal函数的使用
- signal函数的使用
- signal函数的使用
- signal函数的缺点
- signal函数的陷阱
- signal函数的讲解
- (信号管理)signal函数说明
- linux用户空间和内核空间的延时函数
- signal函数的简单应用
- signal函数的复杂声明
- signal函数声明的理解
- 彻底卸载Oracle
- 网络流
- 论中国IT行业的现状
- [JAVA]全新java初学者实践教程(全)
- dl dt dd样式
- 用户空间的signal函数说明
- java调用bat文件
- effective c++ 条款23: 必须返回一个对象时不要试图返回一个引用
- 在ORACLE中NULL与SQLSERVER的区别
- 汽轮机调节系统-不等率
- 如何学编程?
- Mondrian 中 XML elements
- ava中相对路径,绝对路径问题总结
- C/C++基础知识:typedef用法小结