linux 系统对信号的处理,Linux下的信号处理函数总结
1.信号处理函数
相关函数原型如下:
#include
sighandler_t signal(int signum, sighandler_t handler);
第一参数是信号
第二个参数是信号处理器:
1.可以是SIG_DFL,信号的默认动作
2. 可以是SIG_IGN,忽略该信号
3. 一个带有一个整型参数的处理函数。
#include
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
signum 要处理的信号
act 指针,指向描述操作的结构 如何响应信号的结构体
oldact 指针,指向描述被替换操作的结构 被替换的处理设置的结构体
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
进程该如何处理信号(早期的信号处理机制):
进程可以通过signal系统调用来告诉内核该怎么去处理信号
1.接受默认处理
按照信号本来的意图区处理 signal(SIGINT,SIG_DFL)
2.忽略信号
signal(SIGINT,SIG_IGN) 忽略SIGINT信号
3.调用一个函数
signal(SIGINT,functionname)
2.早期的信号处理机制存在的问题
一:信号处理函数每次调用后都要被禁用(根据系统的不同而不不同)
二:不知道信号被发送的原因
三:处理函数中不能安全地阻塞其他信号
四:不支持信号中断,信号会被阻塞。(不同的系统可能不同)
3.POSIX信号处理函数
POSIX提供了sigaction这个信号处理函数。相应的提供了一个sigaction结构体。
这个结构体中的sa_flags定义了一些如何处理早期信号机制存在的问题的标志位,可以通过与操作进行组合。
下面仅列出部分标志位:
SA_RESETHAND 当处理函数被调用时重置而不是禁用
SA_NODEFER 关闭信号阻塞,允许递归调用信号
SA_RESTAAT 当系统调用针对一些慢速设备或类似的系统调用重新开始而不是返回
SA_SIGINFO 指明使用sa_sigaction函数的值,,如果这个位没有设置,那么就使用sa_handle指向的函数的值,如果sa_sigaction被使用了,那么传递给函数的将不只是信号的编号,而是信号产生的原因和条件的结构体。
下面的一个例子将演示如何使用sigaction来实现安全的阻塞其它信号
#include
#include
#include
#define INPUTLEN 100
int main ( int argc, char *argv[] )
{
struct sigaction newhandler;
#定义一个信号集
sigset_t blocked;
char x[INPUTLEN];
#设置信号处理函数
newhandler.sa_handler = inthandler;
#设置信号处理函数重置
newhandler.sa_flags = SA_RESETHAND|SA_RESTART
#清空信号集
sigemptyset(&blocked);
#添加SIGQUIT信号集
sigaddset(&block,SIGQUIT);
#设置屏蔽的信号集
newhandler.sa_mask = blocked;
#装载信号
if(sigaction(SIGINT,&newhandler,NULL) == -1)
perror("sigaction");
else
while(1){
fgets(x,INPUTLEN,stdin);
printf("INput: %s",x);
}
return EXIT_SUCCESS;
}
/* ---------- end of function main ---------- */
void inthandler (int s)
{
printf("Called with signal %d\n",s);
sleep(s);
printf("done handling signal %d\n",s);
} /* ----- end of function inthandler ----- */
linux 系统对信号的处理,Linux下的信号处理函数总结相关推荐
- Linux 多线程应用中如何编写安全的信号处理函数
Linux 多线程应用中编写安全的信号处理函数 在开发多线程应用时,开发人员一般都会考虑线程安全,会使用 pthread_mutex 去保护全局变量.如果应用中使用了信号,而且信号的产生不是因为程序运 ...
- linux中信号的处理,linux中关于信号处理笔记(二)
2 等待一个全局变量被设置 这种情况是等待一个信号处理程序设置一个全局变量.下面的例子用于捕捉中断信号和退出信号,但是希望仅当退出信号处理程序时,才唤醒主进程. #include #include # ...
- linux 屏蔽信号 sig_kill sig_stop,linux 信号处理
曾做过signal相关的一点儿开发,谈谈我的一些理解. 首先,需要理解几个signal相关的函数. sigaddset(sigset_t* sigSet, int sigNum ) : 将信号sig ...
- linux 向程序发送信号,Linux下的信号处理
Linux下的信号处理 发布时间:2006-01-02 09:34:14来源:红联作者:reing 前言:这一章我们讨论一下Linux下的信号处理函数. Linux下的信号处理函数: 信号的产生 信号 ...
- Linux信号 二 信号处理函数注册
每一个信号都有一个信号处理函数,可以是SIG_IGN, SIG_DFL或者是用户自定义的处理函数.使用用户自定义的处理函数需要注册,注册接口有如下两种. 第一种是signal调用 #include & ...
- Linux C: 信号及异常和捕捉函数原理
#define SIGHUP 1 终端挂起或控制进程终止 #define SIGINT 2 终端中断(Ctrl+C 组合键) #define SIGQUIT 3 终端退出(Ctrl+\组合键) #de ...
- linux 可定义信号数,Linux系统编程(20)——信号基本概念
信号及信号来源 信号是在软件层次上对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的.信号是异步的,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知 ...
- Linux操作系统下信号处理函数
Linux系统下的信号 一.信号概念 1. 什么是信号 信号是软件中断,信号提供了一种异步处理事件的方法,它允许进程和内核中断其他进程.一个信号就是一条消息,它通知进程系统发生了一个某种类型的事件,在 ...
- Linux进程间通信——信号
一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...
最新文章
- R语言关系操作符:>、<=、!=、>=、==、
- BCH领头,主流币全数突破压力线
- 【深度学习】解析神经网络中的数值稳定性、模型初始化和分布偏移(Pytorch)
- Kooboo 全文索引研究
- 蚂蚁科技 Service Mesh 落地实践与挑战 | GIAC 实录
- 准确估计透明物体的 3D 姿态:机器人收集 + Keypose 算法
- Python3 解释器
- 苹果发布2019年上半年透明度报告,收到数万条政府请求
- 【java学习之路】(java SE篇)(讨论与思考)关于继承,封装,多态,接口的简单实现与思考
- NLP --- 文本分类(基于LDA的隐语意分析训练算法详解)
- Vue之webpack之基本使用
- Leetcode-496-下一个更大元素 I
- 如何时刻保持在目标的正确轨道上
- Android(安卓)手机变砖复活的三种恢复方法
- [来料检验]触摸屏来料检验设想
- 彼得林奇的成功投资二——长期经营业绩
- 读《创业36条军规》(四)创业是最好的武器
- 十大最佳Android游戏下载平台
- 论游戏程序员的自我修养(MiloYip)
- DEV pivotGridControl 单元格内容变色
热门文章
- nrf52832开发配置文件小记
- [WC2007] 剪刀石头布
- 【JQuery NoviceToNinja系列】目录
- 一扬开源新闻静态生成系统V1.0发布
- 关于错误:不能将licenses.licx文件转换成二进制,error lc0003 !
- [转载] Python简介、linux上Python及其IDE的安装和详细配置
- [转载] 多元线性回归 及其Python实现
- Java学习目录(持续更新中)
- loj2291. 「THUSC 2016」补退选
- 2017.8.15 数据库