一、信号的概念

  信号(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函数的更多相关文章

  1. UNIX高级环境编程(13)信号 - 概念、signal函数、可重入函数

    信号就是软中断. 信号提供了异步处理事件的一种方式.例如,用户在终端按下结束进程键,使一个进程提前终止.   1 信号的概念 每一个信号都有一个名字,它们的名字都以SIG打头.例如,每当进程调用了ab ...

  2. signal函数、sigaction函数及信号集(sigemptyset,sigaddset)操作函数

    信号是与一定的进程相联系的.也就是说,一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如,一个进程可以忽略某些信号而只处理其他一些信号:另外,一个进程还可以选择如何处理信号.总之,这些总与特定 ...

  3. 三十、Linux 进程与信号——信号的概念及 signal 函数

    30.1 信号的基本概念 信号(signal)机制是Linux 系统中最为古老的进程之间的通信机制,解决进程在正常运行过程中被中断的问题,导致进程的处理流程会发生变化 信号是软件中断 信号是异步事件 ...

  4. Linux下利用signal函数处理ctrl+c等信号

    前言 linux下能够通过信号机制来实现程序的软中断,是一个很实用的编程方法. 我们平时在程序执行的时候按下ctrl-c.ctrl-z或者kill一个进程的时候事实上都等效于向这个进程发送了一个特定信 ...

  5. 异步处理方式之信号(一):基础知识和signal函数说明

    文章目录 1. 引言 2. 信号的概念 2.1 信号操作之忽略信号 2.2 信号操作之捕捉信号 2.3 信号操作之执行系统默认操作 2.4 常见的信号 3. 函数signal 3.1 signal函数 ...

  6. Linux 信号(二)—— signal 函数

    弗洛伊德认为:要解决这些苦恼,当事人就要通过回忆并理解自己早期的童年经历,来获得对潜意识冲突的顿悟.弗洛伊德的疗法被称为“精神分析” (psychoanalysis),在 20 世纪的很长一段时间被心 ...

  7. Linux 信号详解一(signal函数)

    信号列表 SIGABRT 进程停止运行 SIGALRM 警告钟 SIGFPE 算述运算例外 SIGHUP 系统挂断 SIGILL 非法指令 SIGINT 终端中断 SIGKILL 停止进程(此信号不能 ...

  8. 信号之signal函数

    UNIX系统的信号机制最简单的接口是signal函数.signal函数的功能:为指定的信号安装一个新的信号处理函数. #include <signal.h> void (*signal(i ...

  9. UNIX环境高级编程——信号基本概述和signal函数

    一.为了理解信号,先从我们最熟悉的场景说起:1. 用户输入命令,在Shell下启动一个前台进程.2. 用户按下Ctrl-C,这个键盘输入产生一个硬件中断.3. 如果CPU当前正在执行这个进程的代码,则 ...

随机推荐

  1. 部署KVM

    1.安装前准备1)服务器或者PC的CPU能支持VT技术2)虚拟机中安装KVM要勾选:处理器:虚拟化Intel VT-x/EPT或AMD-V/RVI(V)[root@localhost ~]# cat ...

  2. cf1088C Ehab and a 2-operation task (构造)

    题意:给一个数列,你可以进行至多n+1次操作,每次给一个前缀对某数取模或者加某数,使得最后数列严格单增 考虑到因为是前缀和而且还不能加负数,光靠加是不能让前面的小于后面的 所以要让他先在模某数意义下单 ...

  3. LOJ#510 北校门外的回忆(找性质+倍增+线段树)

    这题一场模拟赛我们出了弱化版(n<=1e6),抄题面给的程序能拿到71分的好成绩 其实后面的29分是加了几个1e9的数据卡人 这糟老头子真是坏得很 正解我们机房看了三天 在这里感谢这篇题解的作者 ...

  4. poj-3279 poj-1753(二进制枚举)

    题目链接:http://poj.org/problem?id=3279 题目大意: 有一个m*n的棋盘(1 ≤ M ≤ 15; 1 ≤ N ≤ 15),每个格子有两面分别是0或1,每次可以对一个格子做 ...

  5. HDU--4486 Task(贪心)

    题目链接  4486 Task 按照时间从大到小排序 然后枚举所有的y值 用一个数组存储 符合要求就算上 #include<bits/stdc++.h> using namespace s ...

  6. Vue--组件嵌套

    1.全局注册: 组件放到components文件夹内,建议组件名是什么行为的name名就是什么 main.js 引入组件:import Users from '组件位置' 注册全局组件:Vue.com ...

  7. tyvj/joyoi 1336 火车进栈

    比原题水了很多(因为原题要高精度) 输出字典序前20种出栈序列. 其实是贪心题:我们每次确定一个出栈的数. 当栈里有数时,字典序显然比从后面拿数要小,所以先搜这个. 之后依次搜后面队列里的数,因为字典 ...

  8. 用宏定义代替printf函数

    来自:http://blog.csdn.net/yannanxiu/article/details/52506451 #define _DEBUG_ 1 #if _DEBUG_ #define PR( ...

  9. struts2 二: 参数封装

    封装请求正文到对象中(非常重要) 1.静态参数封装 在struts.xml配置文件中,给动作类注入值.调用的是setter方法. struts.xml的编写: <action name=&quo ...

  10. JMeter-Java压力测试工具-01

    先去官网下载 打开 下面测试一个小栗子 建立一个工程,提供一个查询接口 package com.example.demo; import org.springframework.web.bind.an ...