signal函数说明
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 (;;) ;
}
[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<sl 20:24 0:00 /sbin/audispd
root 1275 0.0 0.0 1880 580 ? Ss 20:24 0:00 /usr/sbin/acpid
68 1395 0.0 0.0 3384 948 ? S 20:24 0:00 hald-addon-acpi: listening on acpid socket /var/run/acpid.socket
root 1669 0.0 0.5 22344 6028 ? Ss 20:26 0:00 /usr/sbin/abrtd
root 1697 0.0 0.0 2240 320 ? Ss 20:26 0:00 /usr/sbin/atd
root 1742 1.6 2.1 32496 21752 tty1 Rs+ 20:26 1:47 /usr/bin/Xorg :0 -nr -verbose -auth /var/run/gdm/auth-for-gdm-eLxmfB/database -nolisten tcp vt1
zcm 2388 0.0 1.4 34860 15316 ? S 20:32 0:00 python /usr/share/system-config-printer/applet.py
zcm 7666 7.5 0.0 1728 356 pts/0 T 22:15 0:06 ./a
zcm 7714 0.0 0.0 5816 724 pts/0 S+ 22:17 0:00 grep ./a
[zcm@t #32]$kill -HUP 463
bash: kill: (463) - 没有那个进程
[zcm@t #33]$kill -HUP 7666
[zcm@t #34]$kill -9 7666
[zcm@t #35]$ps aux|grep ./a
root 1164 0.0 0.0 13320 748 ? S<sl 20:24 0:00 /sbin/audispd
root 1275 0.0 0.0 1880 580 ? Ss 20:24 0:00 /usr/sbin/acpid
68 1395 0.0 0.0 3384 948 ? S 20:24 0:00 hald-addon-acpi: listening on acpid socket /var/run/acpid.socket
root 1669 0.0 0.5 22344 6028 ? Ss 20:26 0:00 /usr/sbin/abrtd
root 1697 0.0 0.0 2240 320 ? Ss 20:26 0:00 /usr/sbin/atd
root 1742 1.6 2.1 32496 21752 tty1 Rs+ 20:26 1:48 /usr/bin/Xorg :0 -nr -verbose -auth /var/run/gdm/auth-for-gdm-eLxmfB/database -nolisten tcp vt1
zcm 2388 0.0 1.4 34860 15324 ? S 20:32 0:00 python /usr/share/system-config-printer/applet.py
zcm 7746 0.0 0.0 5816 756 pts/0 S+ 22:18 0:00 grep ./a
[1]+ 已杀死 ./a
[zcm@t #36]$
signal函数说明相关推荐
- linux signal函数用法,linux信号机制之sigaction构造体浅析,signal 函数,信号捕捉.
来自:http://hi.baidu.com/phenix_yw/blog/item/6eb4ca391d1479f23a87ce19.html 信号安装函数sigaction(int signum, ...
- C语言signal()函数(通过设置一个函数(回调函数)来处理捕获到异常信号时需要执行的操作)
文章目录 描述 声明 参数 返回值 实例 附加解释 背景知识:C语言中signal函数简介及使用 描述 C 库函数 void (*signal(int sig, void (*func)(int))) ...
- 如何理解signal函数声明
Signal函数用起来其实很简单,但是回头看看他的声明,相信会有很多人表示费解.自己也在这个问题中纠结了好几年了,今天终于弄明白,很是兴奋,一起分享一下. 先看函数原型:void (*signal(i ...
- C专家编程—分析signal函数的原型声明{void (*signal(int sig,void (*func)(int)))(int)}(2)
在ANSI标准中,signal()的声明如下: void (*signal(int sig,void (*func)(int)))(int) signal是一个函数,它返回一个函数指针,后者 ...
- Linux信号之signal函数
1. 信号概述 何为信号:信号就是由用户.系统或进程发送给目标进程的信息,以通知目标进程中某个状态的改变或是异常. 信号产生:总体来说,其产生的条件有两种,分别是:硬件和软件原因,又称为:硬中断和软中 ...
- Linux系统编程29:进程信号之什么是信号及signal函数
文章目录 (1)CTRL+C (2)注意 (3)信号列表 (4)处理信号-signal函数 (1)CTRL+C 我们都知道,按下ctrl+c后将会结束当前运行的一个前台进程,当我们按下ctrl+c后, ...
- signal函数详解
SIGABRT 进程停止运行 6 SIGALRM 警告钟 SIGFPE 算述运算例外 SIGHUP 系统挂断 SIGILL 非法指令 SIGINT 终端中断 2 SIGKILL 停止进程(此信号不能被 ...
- c语言signal函数详细说明
c语言中singal函数详细解释说明 对于信号处理函数位于<sys/singal.h>中 void (*signal(int sig,void(*handler)(int))) (int) ...
- signal函数原型解读
今天复习信号,被函数指针和signal函数的原型绕住了,看了几篇博客,这里记录一下. 以下内容摘自signal() 函数详解,想要理解signal的原型,要先理解signal函数的返回值是一个函数指针 ...
最新文章
- 微服务架构下的测试之道
- [洛谷P4889]kls与flag
- 在Tableau中实现表格下钻
- RISC-V应用创新大赛 | 一文详解RVB2601套件 助你快速上手赢比赛
- 前端学习(1560):ng-class颜色切换
- 用VB构键Internet的应用
- was环境访问https_Go语言笔记|02-开发环境搭建
- Java内部类手机专卖店_Java:内部类
- python做逻辑回归r2_利用python实现逻辑回归
- selinium如何多线程_求教个selenium+grid+testng多线程运行的问题
- 金蝶k3wise云服务器配置,金蝶K3WISEV15.0系统配置说明
- 计算机毕业设计java+ssm的在线投票管理系统(源码+系统+mysql数据库+Lw文档)
- 如何构建健商品期carry组合
- 微信小程序调试过程中页面加载不出来
- IntelliJ IDEA启动tomcat报错:Disconnected from server
- ADP的人力资源外包方法论
- Mongodb操作基础 分片
- 性能问题从发现到优化一般思路
- java中接口可以继承接口吗?
- matlab yalmip在微电网优化调度中的应用(一)