一.信号的概念

  信号就是一种软中断,进程与进程之间信号的传递,都是通过内核来当做中转站的,不能直接传递信号。

二、信号的分类(128位信号,不过可用信号就1~64除去32与33)

  1.不可靠信号(SIGHUP(1)~SIGSYS(31)):由于他是非实时信号,所以他会产生多次信号,但不支持排队,并且只接受一次,因此信号有可能丢失,所以是不可靠信号。

  2.可靠信号(SIGRGMI(34)~SIGRTMAX(64)):由于他是实时信号,如果他产生多次信号,他会进行排队,信号会被全盘接受,信号不会丢失,所以是可靠信号。

三、信号的捕获与处理

   1.signal函数会注册一个信号处理函数,需要在程序开始时初始化,如果程序接受到信号时,这个函数就会启用。

   2.用fork函数创建的子进程会继承父进程的信号处理方式,当vfork和exec组成而创建的子进程不会继承父进程的信号处理方式。

四、信号的发送

  1.终端发送:kill  -sig  pid                  2.函数调用:int   kill(pid_t pid,int sig)

  3.有关时间的信号

    a.睡眠(pause):没有时间的限制,只有收到不可忽略的信号时,才会结束此函数,如果有信号处理函数,先执行信号处理函数,再返回-1

    b.睡眠(sleep):可手动控制时间的函数,若收到信号,则返回剩余的秒数,如没收到信号,则等时间过完,返回0

    c.时钟(alarm):闹钟一般需要与pause函数结合使用,当度过所设定的时间是,会返回一个SIGALRM信号,默认处理直接退出。

     

   

五、信号屏蔽

  1.信号集

    a.信号集的创建

      1)创建信号集  sigset_t*  set

      2)  填满信号集  sigfillset(sigset_t*  set)

      3)清空信号集  sigemptyset(sigset_t*  set)

      4)向信号集中添加信号   sigaddset(sigset_t*  set,int  signal)

      5)向信号集中删除信号 sigdelset(sigset_t*  set,int siganl)

      6)  测试信号集中的信号    sigismember(const   sigset_t*  set,int signal)

   2.屏蔽信号(signal mask)

    每一个进程都有一个屏蔽掩码 , 里面包含了进程的屏蔽信号。

    信号的屏蔽不是选择不接受信号,而是延时接受信号。

         延时接受:设置屏蔽掩码的目的是为了防止程序在进程一些敏感操作时,被打断。当处理完敏感操作后,就会接受信号。可靠信号会排队接受,不可靠信号只接受一次。

    int signprocmask(int how,const sigset_t *set,sigset_t * oldset)

功能:设置进程的信号掩码(信号屏蔽码)

how:修改信号掩码的方式

SIG_BLOCK:向信号掩码中添加信号

SIG_UNBLOCK:从信号掩码中删除信号

SIG_SETMASK:用新的信号集替换旧的信号掩码

newset:新添加、删除、替换的信号集,也可以为空

oldset:获取旧的信号掩码

int  sigpending(sigset_t *set)

   功能:获取未决状态的信号

六、计时器

操作系统维护了三个计时器

真实计时器:程序的运行时间

虚拟计时器:记录程序在用户态耗费的时间

实用计时器:记录程序在用户态和内核态耗费的时间和

真实  =  实用  +  进出的耗费  +  休眠。

int getitimer(int which, struct itimerval *curr_value);

功能:获取之间设置的定时任务

which:计时器的类型

ITIMER_REAL :真实时间,信号是:SIGALRM

ITIMER_VIRTUAL:虚拟,信号:SIGVTALEM

ITIMER_PROF :实用,信号:SIGPROF

curr_value:

it_interval:时钟信号的间隔时间

it_value:第一次时钟信号产生的时间

UNIX环境C - 系统信号的更多相关文章

  1. UNIX环境高级编程——信号说明列表

    $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGK ...

  2. Unix环境高级编程---信号

    参考博客:http://blog.csdn.net/alex_my/article/details/39494129 1. 信号概念 何为信号? 信号是一种软中断,可以由以下情形触发: -1: 用户按 ...

  3. UNIX环境高级编程——信号

    一.信号生命周期 从信号发送到信号处理函数的执行完毕. 对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个重要的阶段,这三个阶段由四个重要事件来刻画:信号诞生:信号在进 ...

  4. UNIX环境高级编程——信号(API)

    一.信号在内核中的表示     实际执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending).进程可以选择阻塞(Block)某个信号.被阻塞的信号 ...

  5. UNIX环境高级编程——信号之kill、raise、killpg、alarm、pause、abort、sleep、usleep、nanosleep和setitimer函数

    一.kill, raise, killpg 函数 int kill(pid_t pid, int sig); int raise(int sig); int killpg(int pgrp, int ...

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

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

  7. 高级UNIX环境编程10 信号

    信号是软件中断,提供一种处理异步事件的方法 <signal.h> sigaction()

  8. UNIX环境高级编程——sigqueue、sigsuspend函数

    一.sigqueue函数 功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用. int sigqueue(pid_t pid, int sig, ...

  9. (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

随机推荐

  1. Conetos 下安装docker 和镜像加速

    首先升级yum yum update 安装yum-utils,它提供yum-config-manager可以用来配置repo yum install -y yum-utils 使用以下命令设置稳定版 ...

  2. linux环境下编译Android apk

    Android源码目录下的build/envsetup.sh文件,描述编译的命令 - m:       Makes from the top of the tree. - mm:      Build ...

  3. HDU 4585 Shaolin (STL map)

    Shaolin Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  4. 【转帖】UDIMM、RDIMM、SODIMM以及LRDIMM的区别

    转载自http://www.sohu.com/a/165343889_781333. DIMM简介 DIMM(Dual Inline Memory Module,双列直插内存模块)与SIMM(sing ...

  5. Excel透视表基础之字段布局与重命名、更新、数字格式设置、空值与错误值、

    字段布局与重命名 经典布局切换 字段布局 默认布局:文本类型在行区域.数字类型在值区域. 最好用鼠标拖拽. 字段重命名 可以在字段设置中更改. 透视表更新 延迟更新 手动刷新 自动刷新 刷新注意事项 ...

  6. MySQL -2- 体系结构-多实例模块

    0.在已创建mysql,port=3306的数据库前提下 需要删除/etc/.my.cnf再做以下操作 cp /etc/my.cnf /etc/my.cnf.3306 1.mkdir -p /u02/ ...

  7. 小记---------网页采集之selenium

    1.元素定位 ID定位元素:  findElement(By.id(“”));  通过元素的名称定位元素:  findElement(By.name(“”));   通过元素的html中的位置定位元素 ...

  8. __strong修饰符

    本文用来观察,对于__strong修饰符,编译器为我们自动添加了什么代码,这些代码对于引用计数有什么影响. 例子一 X __strong *x1 = [[X alloc] init]; 使用控制台打印 ...

  9. 洛谷 P1472 奶牛家谱 Cow Pedigrees 题解

    题面 这道题我觉得是个不错的题: 根据题意可以较清晰的发现ans只和n和k有关:(因为输入的只有这两个数啊~): 那么设f[i][j]表示前i层用了j个节点的方案数,g[i][j]表示深度小于等于i并 ...

  10. C++中组合和继承的概念及意义

    1,继承在面向对象中具有举足轻重的地位,面向对象当中的很多高级技术都和继承是息息相关的,比如面向对象的高端课程<设计模式>中的每一种技术都和继承有关,因此我们非常有必要在学习 C++ 时, ...