POSIX信号和自定义signal函数
一、信号的概念
信号(signal)就是告知某个进程发生了某个事件的通知;信号通常是异步发生的,也就是说接受信号的进程不知道信号的准确
发生时刻;信号可以(1)由一个进程发给另一个进程;(2)由内核发给某个进程
二、信号的处置
每个信号都有一个与之关联的处置,即收到特定信号时的处理方法;可以通过调用sigaction函数来设定一个信号的处置
(POSIX明确规定了调用sigaction时的语义定义,因此我们自定义signal并调用sigaction,以所期望的POSIX语义提供一个简单的接口)
处置方法有三种:
(1)提供一个函数,只要有特定信号发生它就被调用,这样的函数称为信号处理函数,这种行为称为捕获信号;有两个信号SIGKILL和
SIGSTOP不能被捕获;信号处理函数由信号值这个单一的整数参数来调用,且没有返回值,其函数原型如下:
- void handler(int signo);
(2)可以把某个信号的处置方法设定为SIG_IGN来忽略它;SIDKILL和SIDSTOP这两个信号不能被忽略;
(3)可以把某个信号的处置方法设定为SIG_DEF来启用它的默认处置;有个别信号的默认处置为忽略,如SIGCHLD和SIGURG
三、signal函数
- #include <signal.h>
- typedef void Sigfunc(int);
- Sigfunc *signal(int signo, Sigfunc *func) {
- struct sigaction act, oact;
- act.sa_handler = func; /* 设置处置方法 */
- sigemptyset(&act.sa_mask); /* 把sa_mask置为空集,在信号处理期间不阻塞额外的信号 */
- act.sa_flags = ;
- if (signo != SIGALRM) { /* 在POSIX兼容的平台上,SIGALRM是在定时器终止时发送给进程的信号 */
- act.sa_flags |= SA_RESTART;
- }
- if (sigaction(signo, &act, &oact) < ) {
- return SIG_ERR;
- }
- return (oact.sa_handler);
- }
- 注:a |= b 即 a = a|b,其中|表示位或;a &= b 即 a = a&b,其中&表示位与
四、处理每个信号的选项标志(sa_flags)
五、信号列表
- 信号 取值 默认动作 含义(发出信号的原因)
- SIGHUP Term 终端的挂断或进程死亡
- SIGINT Term 来自键盘的中断信号
- SIGQUIT Core 来自键盘的离开信号
- SIGILL Core 非法指令
- SIGABRT Core 来自abort的异常信号
- SIGFPE Core 浮点例外
- SIGKILL Term 杀死
- SIGSEGV Core 段非法错误(内存引用无效)
- SIGPIPE Term 管道损坏:向一个没有读进程的管道写数据
- SIGALRM Term 来自alarm的计时器到时信号
- SIGTERM Term 终止
- SIGUSR1 ,, Term 用户自定义信号1
- SIGUSR2 ,, Term 用户自定义信号2
- SIGCHLD ,, Ign 子进程停止或终止
- SIGCONT ,, Cont 如果停止,继续执行
- SIGSTOP ,, Stop 非来自终端的停止信号
- SIGTSTP ,, Stop 来自终端的停止信号
- SIGTTIN ,, Stop 后台进程读终端
- SIGTTOU ,, Stop 后台进程写终端
- SIGBUS ,, Core 总线错误(内存访问错误)
- SIGPOLL Term Pollable事件发生(Sys V),与SIGIO同义
- SIGPROF ,, Term 统计分布图用计时器到时
- SIGSYS ,-, Core 非法系统调用(SVr4)
- SIGTRAP Core 跟踪/断点自陷
- SIGURG ,, Ign socket紧急信号(.2BSD)
- SIGVTALRM ,, Term 虚拟计时器到时(.2BSD)
- SIGXCPU ,, Core 超过CPU时限(.2BSD)
- SIGXFSZ ,, Core 超过文件长度限制(.2BSD)
- SIGIOT Core IOT自陷,与SIGABRT同义
- SIGEMT ,-, Term
- SIGSTKFLT -,,- Term 协处理器堆栈错误(不使用)
- SIGIO ,, Term 描述符上可以进行I/O操作
- SIGCLD -,-, Ign 与SIGCHLD同义
- SIGPWR ,, Term 电力故障(System V)
- SIGINFO ,-,- 与SIGPWR同义
- SIGLOST -,-,- Term 文件锁丢失
- SIGWINCH ,, Ign 窗口大小改变(.3BSD, Sun)
- SIGUNUSED -,,- Term 未使用信号(will be SIGSYS)
六、POSIX信号语义小结
(1)一旦安装了信号处理函数,它便一直安装着(较早期的系统是每执行一次就将其拆除);
(2)在一个信号处理函数运行期间,正被递交的信号是阻塞的;并且,安装处理函数时在递交给sigaction函数的sa_mask信号集中
指定的任何额外信号也被阻塞;
(3)如果一个信号在被阻塞期间产生了一次或多次,那么该信号被解阻塞之后通常只递交一次,也就是说Unix信号默认是不排队的;
(4)利用sigprocmask函数选择性地阻塞或解阻塞一组信号是可能的;这使得我们可以做到在一段临界区代码执行期间,防止捕获某
些信号,以此保护这段代码
POSIX信号和自定义signal函数的更多相关文章
- UNIX高级环境编程(13)信号 - 概念、signal函数、可重入函数
信号就是软中断. 信号提供了异步处理事件的一种方式.例如,用户在终端按下结束进程键,使一个进程提前终止. 1 信号的概念 每一个信号都有一个名字,它们的名字都以SIG打头.例如,每当进程调用了ab ...
- signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数
信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...
- 三十、Linux 进程与信号——信号的概念及 signal 函数
30.1 信号的基本概念 信号(signal)机制是Linux 系统中最为古老的进程之间的通信机制,解决进程在正常运行过程中被中断的问题,导致进程的处理流程会发生变化 信号是软件中断 信号是异步事件 ...
- Linux下利用signal函数处理ctrl+c等信号
前言 linux下能够通过信号机制来实现程序的软中断,是一个很实用的编程方法. 我们平时在程序执行的时候按下ctrl-c.ctrl-z或者kill一个进程的时候事实上都等效于向这个进程发送了一个特定信 ...
- 异步处理方式之信号(一):基础知识和signal函数说明
文章目录 1. 引言 2. 信号的概念 2.1 信号操作之忽略信号 2.2 信号操作之捕捉信号 2.3 信号操作之执行系统默认操作 2.4 常见的信号 3. 函数signal 3.1 signal函数 ...
- Linux 信号(二)—— signal 函数
弗洛伊德认为:要解决这些苦恼,当事人就要通过回忆并理解自己早期的童年经历,来获得对潜意识冲突的顿悟.弗洛伊德的疗法被称为“精神分析” (psychoanalysis),在 20 世纪的很长一段时间被心 ...
- Linux 信号详解一(signal函数)
信号列表 SIGABRT 进程停止运行 SIGALRM 警告钟 SIGFPE 算述运算例外 SIGHUP 系统挂断 SIGILL 非法指令 SIGINT 终端中断 SIGKILL 停止进程(此信号不能 ...
- 信号之signal函数
UNIX系统的信号机制最简单的接口是signal函数.signal函数的功能:为指定的信号安装一个新的信号处理函数. #include <signal.h> void (*signal(i ...
- UNIX环境高级编程——信号基本概述和signal函数
一.为了理解信号,先从我们最熟悉的场景说起:1. 用户输入命令,在Shell下启动一个前台进程.2. 用户按下Ctrl-C,这个键盘输入产生一个硬件中断.3. 如果CPU当前正在执行这个进程的代码,则 ...
随机推荐
- 诶西,JavaScript学习记录。。。。。。
由于大学课程缘故,老师巨爱叫人问问题,还记分呢,随便记录一下Js的学习情况,以后复习什么的也比较方便吧...... 开始咯,就按照C语言学习那样的方法来吧! ===================== ...
- Python中何时使用断言 assert
使用断言的最佳时机偶尔会被提起,通常是因为有人误用,因此我觉得有必要写一篇文章来阐述一下什么时候应该用断言,为什么应该用,什么时候不该用. 对那些没有意识到用断言的最佳时机的人来说,Python的断言 ...
- python 验证码识别
一.python识别简单验证码: 代码: ''' func:实现简单验证码获取 ''' import pytesseract from PIL import Image #首先通过Image打开一个图 ...
- bzoj2554: Color
Description 有n个球排成一列,每个球都有一个颜色,用A-Z的大写字母来表示,我们每次随机选出两个球ball1,ball2,使得后者染上前者的颜色,求期望操作多少次,才能使得所有球的颜色都一 ...
- 小Y的炮
[存代码] #include<bits/stdc++.h> #define N 1000001 #define MAXN 100001 using namespace std; int n ...
- 【模板】splay维护序列
题目大意:维护一个长度为 N 的序列,支持单点插入,单点询问. 注意事项如下: build 函数中要记得初始化 fa. 插入两个端点值. 代码如下 #include <bits/stdc++.h ...
- 系统API执行没效果,可以检查一下是否与 360安全卫士 有关?!
今天在写一个工具软件,使用到一个系统API: mouse_event() 代码如下: mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, x2, ...
- python 类的介绍实例
使用面向对象的优点: 1.能够更好的设计软件架构 2.维护软件模块 3.易于架构和组件的重用 类的定义: 构造函数:初始化用,写不写都可以,默认为空 类属性:属于类的对象 方法属性:不属于类的对象 私 ...
- POJ 1639 Picnic Planning 最小k度生成树
Picnic Planning Time Limit: 5000MS Memory Limit: 10000K Total Submissions:11615 Accepted: 4172 D ...
- 下载神器(vip下载速度)
简单介绍: 用过好几款下载神器,现在推荐一款比较好用的软件,强调一点本软件强调开源免费的原则,禁止一切人员在其中收取费用. 我把这款软件放到了,自己的百度云盘. 神器的使用教程如下: 百度云下载连接: ...