函数函数sigaction、signal
函数函数sigaction
1. 函数sigaction原型:
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
分析:
- 参数 signum :要捕获的信号。
- 参数act:truct sigaction 结构体,后面具体讲解传入参数,新的处理方式
- 参数oldact:返回旧的 struct sigaction 结构体,传出参数,旧的处理方式
1.2 struct sigaction 结构体
struct sigaction
{
void(*sa_handler)(int);
void(*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void(*sa_restorer)(void);
};
分析:
- sa_handler : 不带附加参数的信号处理函数指针
- sa_sigaction: 带有附加参数的信号处理函数指针(两个信号处理函数指针只能二选一)
- sa_mask: 在执行信号处理函数时,应该屏蔽掉哪些信号
- sa_flags: 用于控制信号行为,它的值可以是下面选项的组合。
- SA_SIGINFO:如果指定该选项,则向信号处理函数传递参数(这时应该使用 sa_sigaction 成员而不是 sa_handler).
- sa_restorer:该成员在早期是用来清理函数栈的,如今已被废弃不用。
注意:sa_flags 的选项比较多,大部分可又自己做实验验证,有些是需要额外的知识,比如 SA_ONESTACK 和 SA_RESTART,这些放到后面讲解。本节示例中,只需要把 sa_flags 设置为 0 即可。
信号捕捉特性:
- 进程正常运行时,默认PCB有一个信号屏蔽字,假定为☆,它决定了进程自动屏蔽哪些信号,当注册了某个信号步捕捉函数,捕捉到该信号以后,要调用该函数,而该函数有可能执行很长时间,在这期间所屏蔽的信号不由☆指定,而由sa_mask来指定,调用完信号处理函数,再恢复为☆。
- xxx信号捕捉函数执行期间,XXX信号自动屏蔽。
- 阻塞的常规信号不支持排队,产生多次只记录一次(后32个实时信号支持排队)
1. 测试代码:
#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
#include<unistd.h> void docatch(int signo)
{
printf("%d signal is catch\n", signo);
} int main()
{
int ret;
struct sigaction act;
act.sa_handler = docatch;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGQUIT);
act.sa_flags = ; //默认属性:信号捕捉函数执行期间,自动屏蔽本信号
ret = sigaction(SIGINT, &act, NULL);
if(ret < )
{
perror("sigaction error");
exit();
}
while()
sleep();
return ;
}
输出结果:

2. 测试代码:
#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
#include<unistd.h> void docatch(int signo)
{
printf("%d signal is catch\n", signo);
sleep();
printf("--------------finish-\n");
} int main()
{
int ret;
struct sigaction act;
act.sa_handler = docatch;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGQUIT);
act.sa_flags = ;
ret = sigaction(SIGINT, &act, NULL);
if (ret < )
{
perror("sigaction error");
exit();
}
while ()
sleep();
return ;
}
输出结果:

3. 测试代码:
#include <unistd.h>
#include <signal.h>
#include <stdio.h> void printsigset(const sigset_t *set)
{
for (int i = ; i <= ; i++)
{
if (i == ) putchar(' ');
if (sigismember(set, i) == )
putchar('');
else
putchar('');
}
puts("");
} void handler(int sig)
{
if (sig == SIGTSTP)
printf("hello SIGTSTP\n");
if (sig == SIGINT)
printf("hello SIGINT\n");
sleep();
sigset_t st;
sigpending(&st);
printsigset(&st);
} int main()
{
printf("I'm %d\n", getpid());
struct sigaction act, oldact;
act.sa_handler = handler; // 设置普通信号处理函数
sigemptyset(&act.sa_mask); // 向 sa_mask 中添加 SIGINT
sigaddset(&act.sa_mask, SIGINT);
act.sa_flags = ; // 先置 0 sigaction(SIGTSTP, &act, &oldact);
sigaction(SIGINT, &act, &oldact); while ()
{
write(STDOUT_FILENO, ".", );
pause();
}
return ;
}
输出结果:

分析:
- 当程序运行的时候,Ctrl C 进入 handler,然后立即 Ctrl Z 发现 handler 还未执行完就被 SIGTSTP 打断.
- 当程序运行的时候,Ctrl Z 进入 handler,然后立即 Ctrl C 发现并不会被 SIGINT 打断,这是因为该 handler 注册的时候被设置了 SA_MASK = SIGINT。最后 handler 结束的时候打印了未决信号集,发现里头有 SIGINT。所以 handler 结束后,又去继续对 SIGINT 进行处理。
函数函数sigaction、signal的更多相关文章
- signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数
信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...
- signal函数:void (*signal(int,void(*)(int)))(int);
http://blog.chinaunix.net/uid-20178794-id-1972862.html signal函数:void (*signal(int,void(*)(int)))(int ...
- 简单理解函数声明(以signal函数为例)
这两天遇到一些声明比较复杂的函数,比如signal函数,那我们先简单说说signal函数的用法:(参考<c陷阱与缺陷>) [signal:几乎所有c语言程序的实现过程中都要用到signal ...
- 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板
[源码下载] 不可或缺 Windows Native (16) - C++: 函数重载, 缺省参数, 内联函数, 函数模板 作者:webabcd 介绍不可或缺 Windows Native 之 C++ ...
- Swift 学习一函数&函数属性&懒加载
函数 函数相当于OC中的方法 格式: func 函数名(参数列表) -> 返回值类型 { 代码块 return 返回值} func 函数名(参数列表){ // 返回值为Void 可 ...
- 我用C#调用C编译的dll中有这样一个函数,函数大概的功能就是把数据保存到buf缓冲区中:
我用C#调用C编译的dll中有这样一个函数,函数大概的功能就是把数据保存到buf缓冲区中: C/C++ code ? 1 int retrieve(int scanno,void* buf); 在 ...
- Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数
Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数 目录 Pycharm使用技巧(转载) Python第一天 ...
- python基础 (初识函数&函数进阶)
函数基础部分 .什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...
- python基础之 初识函数&函数进阶
函数基础部分 1.什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...
随机推荐
- P1456 Monkey King
题目地址:P1456 Monkey King 一道挺模板的左偏树题 不会左偏树?看论文打模板,完了之后再回来吧 然后你发现看完论文打完模板之后就可以A掉这道题不用回来了 细节见代码 #include ...
- Django:前后端分离后联调给前端传数据
实现前后端分离后,有了下面几点改变: 1.服务器一分为二,前后端分别部署,静态资源放在前端服务器,业务代码放在后的服务器 2.前端服务器需要接收Http请求(一般使用node.js) 3.前端服务器需 ...
- 利用微信企业号的告警功能,联动检测ICMP的shell脚本
作者:邓聪聪 由于设备IP众多,为了及时发现IP地址有不可达现象,利用微信的联动报警,及时发现问题,以下是脚本内容!!! ping.sh #!/bin/bash ###SCRIPT_NAME:icmp ...
- 修改docker image存放位置
修改镜像和容器的默认存放路径 指定镜像和容器存放路径的参数是--graph=/var/lib/docker,我们只需要修改配置文件指定启动参数即可.刚好有个300g盘的挂在/data目录上,所以在这个 ...
- MinGW GCC 7.2.0 2017年8月份出炉啦
GCC720-for-MSYS2.7z for x86 x64 63.72 MB 发布日期: 2017-08-14 下载地址: https://forum.videohelp.com/attachme ...
- js导出excel增加表头、mso-number-format定义数据格式
问题1:增加表头 js导出表格时,只会导出table里的展现出的内容,如需增加表头等内容需要在页面获取的字符串中拼接表头的相关字符串,详细介绍如下: tableString:新增的表头内容字符串: c ...
- Windows x64汇编函数调用约定
最近在写一些字符串函数的优化,用到x64汇编,我也是第一次接触,故跟大家分享一下. x86:又名 x32 ,表示 Intel x86 架构,即 Intel 的32位 80386 汇编指令集. x64: ...
- mysql5.7 参数记录 (持续更新)
sync_binlog 控制数据库的binlog刷到磁盘 默认sync_binlog=1,表示每次事务提交,MySQL都会把binlog刷下去,是最安全但是性能损耗最大的设置. sync_binlog ...
- 正版phpstorm,webstorm,goland(Jetbrains系列都可以)免费激活步骤(图文详解)(亲测有效)
1 前言 Jetbrains系列都可以,包括webstrom,phpstorm,goland等. 附加其它方案如下: webstrom(注册机) goland(破解补丁) 2 步骤 1. 可以先试用, ...
- [JavaScript]为JS处理二进制数据提供可能性的WEB API
写这篇博客的起源是在div.io上的一篇文章<你所不知道的JavaScript数组>by 小胡子哥下的评论中的讨论. 因为随着XHR2和现代浏览器的普及,在浏览器当中处理二进制不再向过去那 ...