UNIX环境C - 系统信号
一.信号的概念
信号就是一种软中断,进程与进程之间信号的传递,都是通过内核来当做中转站的,不能直接传递信号。
二、信号的分类(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 - 系统信号的更多相关文章
- UNIX环境高级编程——信号说明列表
$ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGK ...
- Unix环境高级编程---信号
参考博客:http://blog.csdn.net/alex_my/article/details/39494129 1. 信号概念 何为信号? 信号是一种软中断,可以由以下情形触发: -1: 用户按 ...
- UNIX环境高级编程——信号
一.信号生命周期 从信号发送到信号处理函数的执行完毕. 对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个重要的阶段,这三个阶段由四个重要事件来刻画:信号诞生:信号在进 ...
- UNIX环境高级编程——信号(API)
一.信号在内核中的表示 实际执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending).进程可以选择阻塞(Block)某个信号.被阻塞的信号 ...
- 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 ...
- UNIX环境高级编程——信号基本概述和signal函数
一.为了理解信号,先从我们最熟悉的场景说起:1. 用户输入命令,在Shell下启动一个前台进程.2. 用户按下Ctrl-C,这个键盘输入产生一个硬件中断.3. 如果CPU当前正在执行这个进程的代码,则 ...
- 高级UNIX环境编程10 信号
信号是软件中断,提供一种处理异步事件的方法 <signal.h> sigaction()
- UNIX环境高级编程——sigqueue、sigsuspend函数
一.sigqueue函数 功能:新的发送信号系统调用,主要是针对实时信号提出的支持信号带有参数,与函数sigaction()配合使用. int sigqueue(pid_t pid, int sig, ...
- (四) 一起学 Unix 环境高级编程(APUE) 之 系统数据文件和信息
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
随机推荐
- HDU2196 Computer【换根dp】
题目传送门 题意: 给定一个$N$个点的树,第$i$条边的长度是$A_i$,求每个点到其他所有点的最长距离.数据范围:$n ≤ 10000$,$A_i ≤ 10_9$ 分析 首先,从随便哪个节点($1 ...
- []转帖]linux 上修改了nginx.conf 怎么重新加载配置文件生效
linux 上修改了nginx.conf 怎么重新加载配置文件生效 https://www.cnblogs.com/zhuyeshen/ 步骤如下先利用/usr/local/nginx/sbin/ng ...
- 2019ICPC徐州游记
裂开QAQ 热身赛听隔壁电科的猛男们说赛前别做题,结果我们3个憨憨还是跑到网吧打哈尔滨的重现赛.结果真的炸裂了,队友D被E题卡哭了,我和队友Z被I题搞炸. 回宾馆的路上都害怕明天裂开. 果然想什么坏事 ...
- noip2013day2-华容道
题目描述 小 \(B\) 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用 编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多 少时间. 小 \(B ...
- 关于setter 和 getter方法的一些总结(初级)
1.最基础的set 和 get 准备工作 Person.h @interface Person : NSObject { NSString *_hobby; // ObjC建议成员变量带"_ ...
- Ubuntu16.04.1安装Caffe(GPU)
Caffe的优势: 1.上手快:模型与相应优化均以文本形式而非代码形式给出,caffe给出了模型的定义,最优化设置以及预训练的权重 2.速度快:与CuDNN结合使用,测试AlexNet模型,在K40上 ...
- synchronized锁住的是代码还是对象,以及synchronized底层实现原理
synchronized (this)原理:涉及两条指令:monitorenter,monitorexit:再说同步方法,从同步方法反编译的结果来看,方法的同步并没有通过指令monitorenter和 ...
- 十二、LaTex中数学公式多行排版
- Linux系统性能测试工具(九)——文件系统的读写性能测试工具之iozone
本文介绍关于Linux系统(适用于centos/ubuntu等)的文件系统的读写性能测试工具-iozone: 参考链接: https://www.cnblogs.com/Dev0ps/p/788938 ...
- pandas的基本功能
一.重新索引 (1)reindex方式 obj = pd.Series(['blue', 'purple', 'yellow'], index=[0, 2, 4]) print(obj) obj.re ...