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 (;;) ; 
}
其中信号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<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]$

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript学习系列(17):数组中的find方法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说…

RSA客户端js加密服务器C#解密(含源码)

本来用https感觉已经差不多了&#xff0c;客户非得要用户登录的时候再加密一次&#xff0c; 因为时间关系&#xff0c;原计划用C做客户端Activex加密暂被取消&#xff0c;花了两天时间在网上到处找&#xff0c;先作出了一个js的客户端加密先用着 思路 1.服务器每次随机生成公私…

vue mint-ui 弹出框

function toast(title){ //提示vm.$toast({message: title,position: middle,duration: 3000}); }效果如下 function toastSuccess(title){ //成功提示vm.$toast({message: title,iconClass: icon icon-success // (图标需自行准备&#xff09;}); } 效果如下 function lo…

REDIS 字典数据结构

对于REDIS来讲 其实就是一个字典结构&#xff0c;key ---->value 就是一个典型的字典结构 【当然 对于vaule来讲的话&#xff0c;有不同的内存组织结构 这是后话】 试想一个这样的存储场景&#xff1a; key:"city" value:"beijing" 如果有若干个这样…

JS之返回指定位置字符的charAt方法

作用&#xff1a;charAt() 方法可返回指定位置的字符&#xff0c;返回的字符是长度为 1 的字符串 语法&#xff1a;stringObject.charAt(index) 参数&#xff1a;必需。表示字符串中某个位置的数字&#xff0c;即字符在字符串中的下标 注意&#xff1a;字符串中第一个字符的…

OOB套接字传输实例(达不到预期结果)

参考资料&#xff1a;<<Linux网络编程.pdf>>page119-205 代码本来是全照书上抄的&#xff0c;后来发现编译不成功&#xff0c;所以就稍微改了下。下面是我修改后的代码&#xff1a; server.c // OOB套接字传输服务端(Server.c)#include <stdio.h>#include…

sql,dateadd,datediff

本文转载自MSDN&#xff0c;为了方便访问&#xff0c;谢谢&#xff01;DATEADD (Transact-SQL)http://msdn.microsoft.com/zh-cn/library/ms186819.aspx将指定 number 时间间隔&#xff08;有符号整数&#xff09;与指定 date 的指定 datepart 相加后&#xff0c;返回该 date。…

公众号H5 VUE获取CODE

回调地址设置页面向导&#xff1a;开发>接口权限>网页服务>网页授权>修改。开发的项目需要放到已经解析好服务器域名的服务器下&#xff0c;同时把Mp***.text文件放到服务器根目录下&#xff0c;此时你的服务器必须能联通外网也就是有公网IP,并且80端口是打开的&am…

javascript学习系列(18):数组中的include方法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说…

curPos和tgtPos

curpos tgtpos 乍一看以为是当前位置和目标位置&#xff0c;但在项目里面这两个位置有点坑 当客户端玩家移动或者AI里面的位置&#xff0c;会把获得的位置付给tgtpos 而以前的tgtpos会付给curpos 所以这个tgtpos是当前玩家或者怪物站立的位置&#xff0c;而curpos是上一个位置 …

JS之获取指定位置Unicode的charCodeAt()方法

用法&#xff1a;charCodeAt() 方法可返回指定位置的字符的 Unicode 编码。这个返回值是 0 - 65535 之间的整数 语法&#xff1a;stringObject.charCodeAt(index) 参数&#xff1a;必需。表示字符串中某个位置的数字&#xff0c;即字符在字符串中的下标 注:1&#xff1a;方法…

利用ioctl获取本机指定设备的MAC地址

// 利用ioctl获取本机指定设备的MAC地址#include<stdio.h>#include<string.h>#include<stdlib.h>#include<errno.h>#include<unistd.h>#include<sys/types.h>#include<sys/socket.h>#include<netinet/in.h>#include<arpa/i…

日本語趣味読み 一 星とり

星とり ある夜のこと、お寺の庭で、小僧さんが、長い竹竿を、あっちこっち振り回りしておりました。 和尚さんがこれを見つけて、 「これこれ、そこで何をしているのじゃ。」 と聞きますと、小僧さんは、 「お空の星がほしくって、打ち落とそうとしているのでございますが、 ひ…

usaco-sprime-superprime-pass

这个题目开始真正用C&#xff0b;&#xff0b;了&#xff0c;因为&#xff0c;数组的分配有限制了&#xff0c;只好用c中的vector: /* ID: qq104801 LANG: C TASK: sprime */#include <iostream> #include <cstdio> #include <string> #include <cstring&…

vue-router使用next()跳转到指定路径时会无限循环

解释1 beforeRouteLeave (to, from, next) {console.log(离开路路由)if(to.fullPath/home){next();}else{next(/home)}这个是组件路由&#xff0c;我想实现的效果是在这个页面点击浏览器的返回按钮后要返回 /home页面而不是上一个页面&#xff0c;上面的代码是没问题的&#x…

JS之按照Unicode返回指定字符串

用法&#xff1a;fromCharCode() 可接受一个指定的 Unicode 值&#xff0c;然后返回一个字符串 语法&#xff1a;String.fromCharCode(numX,numX,…,numX) 参数&#xff1a;必需。一个或多个 Unicode 值&#xff0c;即要创建的字符串中的字符的 Unicode 编码 注意&#xff1…

顺序容器STL::list用法

C Code: // 顺序容器STL::list用法#include<iostream>#include <stdio.h>#include <stdlib.h>#include <list>using namespace std;void appendItems(list<int> &li, int n){for(int i 0; i < n; i){li.push_back(i1);}}void appendIte…

搭建自己的base.js(2)-其他事件方法

获取鼠标按键 // 获取鼠标按键,getButton:function(event) {//DOM,先检测是否支持DOM鼠标事件if(document,implementation.hasFeature("MouseEvents","2.0")) {return event.button; //0主键&#xff0c;1滚轮&#xff0c;2次键} else { //IE8及之前switc…

Linux下的压缩zip,解压缩unzip命令详解及实例

zip all.zip *.jpg #将所有.jpg的文件压缩成一个zip包unzip all.zip #将all.zip中的所有文件解压到当前目录中unzip all.zip -d all #将all.zip 中的所有文件解压到当前目录中的all文件夹中zip -r hy.zip hy #将当前目录下的hy文件夹压缩为hy.zipzip -r hy.zip hy 123.tx…