信号处理(二)

1.1. sigprocmask信号阻塞

函数sigaction中设置的被阻塞信号集合只是针对于要处理的信号,例如

struct sigaction act;

sigemptyset(&act.sa_mask);

sigaddset(&act.sa_mask,SIGQUIT);

sigaction(SIGINT,&act,NULL);

表示只有在处理信号SIGINT时,才阻塞信号SIGQUIT;

函数sigprocmask是全程阻塞,在sigprocmask中设置了阻塞集合后,被阻塞的信号将不能再被信号处理函数捕捉,直到重新设置阻塞信号集合。

原型为:

#include <signal.h>

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

参数how的值为如下3者之一:

a:SIG_BLOCK ,将参数2的信号集合添加到进程原有的阻塞信号集合中

b:SIG_UNBLOCK ,从进程原有的阻塞信号集合移除参数2中包含的信号

c:SIG_SETMASK,重新设置进程的阻塞信号集为参数2的信号集

参数set为阻塞信号集

参数oldset是传出参数,存放进程原有的信号集,通常为NULL

示例:添加全程阻塞

#include <stdio.h>

#include <string.h>

#include <unistd.h>

#include <signal.h>

int g_iSeq=0;

void SignHandlerNew(int iSignNo,siginfo_t *pInfo,void *pReserved)

{

int iSeq=g_iSeq++;

printf("%d Enter SignHandlerNew,signo:%d\n",iSeq,iSignNo);

sleep(3);

printf("%d Leave SignHandlerNew,signo:%d\n",iSeq,iSignNo);

}

int main()

{

char szBuf[8];

int iRet;

//屏蔽掉SIGQUIT信号

sigset_t sigSet;

sigemptyset(&sigSet);

sigaddset(&sigSet,SIGQUIT);

sigprocmask(SIG_BLOCK,&sigSet,NULL);

struct sigaction act;

act.sa_sigaction=SignHandlerNew;

act.sa_flags=SA_SIGINFO;

sigemptyset(&act.sa_mask);

sigaction(SIGINT,&act,NULL);

while(1);

return 0;

}

实例:取消指定信号的全程阻塞。

#include <stdio.h>

#include <string.h>

#include <unistd.h>

#include <signal.h>

int g_iSeq=0;

void SignHandlerNew(int iSignNo,siginfo_t *pInfo,void *pReserved)

{

int iSeq=g_iSeq++;

printf("%d Enter SignHandlerNew,signo:%d\n",iSeq,iSignNo);

sleep(3);

printf("%d Leave SignHandlerNew,signo:%d\n",iSeq,iSignNo);

}

int main()

{

//屏蔽掉SIGINT和SIGQUIT信号,SigHandlerNew将不能再捕捉SIGINT和SIGQUIT

sigset_t sigSet;

sigemptyset(&sigSet);

sigaddset(&sigSet,SIGINT);

sigaddset(&sigSet,SIGQUIT);

sigprocmask(SIG_BLOCK,&sigSet,NULL);//将SIGINT、SIGQUIT屏蔽

struct sigaction act;

act.sa_sigaction=SignHandlerNew;

act.sa_flags=SA_SIGINFO;

sigemptyset(&act.sa_mask);

sigaction(SIGINT,&act,NULL);

sigaction(SIGQUIT,&act,NULL);

int iCount = 0;

while(1)

{

if(iCount > 3)

{

sigset_t sigSet2;

sigemptyset(&sigSet2);

sigaddset(&sigSet2, SIGINT);

sigprocmask(SIG_UNBLOCK, &sigSet2, NULL);

}

iCount ++;

sleep(2);

}

return 0;

}

Example3:利用sigpending测试信号,并采用上图的模型

#include <signal.h>

#include <unistd.h>

void handler(int signum, siginfo_t* pInfo, void* pReversed)

{

printf("receive signal %d \n",signum);

}

int main()

{

sigset_t new_mask, old_mask, pending_mask;

sigemptyset(&new_mask);

sigaddset(&new_mask, SIGINT);

if(sigprocmask(SIG_BLOCK, &new_mask, &old_mask))

printf("block signal SIGINT error\n");

struct sigaction act;

sigemptyset(&act.sa_mask);

act.sa_flags = SA_SIGINFO;

act.sa_sigaction = handler;

if(sigaction(SIGINT, &act, NULL))

printf("install signal SIGINT error\n");

sleep(10);

printf("now begin to get pending mask and unblock SIGINT\n");

if(sigpending(&pending_mask) < 0)//将阻塞信号全部添加到pending_mask信号集中并返回

printf("get pending mask error\n");

if(sigismember(&pending_mask, SIGINT))

printf("signal SIGINT is pending\n");

if(sigprocmask(SIG_SETMASK, &old_mask, NULL) < 0)

printf("unblock signal error\n");

printf("signal unblocked\n");

sleep(10);

return 0;

}

时间: 2024-10-06 01:20:37

信号处理(二)的相关文章

linux 信号处理 二

[摘要]本文分析了Linux内核对于信号的实现机制和应用层的相关处理.首先介绍了软中断信号的本质及信号的两种不同分类方法尤其是不可靠信号的原理.接着分析了内核对于信号的处理流程包括信号的触发/注册/执行及注销等.最后介绍了应用层的相关处理,主要包括信号处理函数的安装.信号的发送.屏蔽阻塞等,最后给了几个简单的应用实例. [关键字]软中断信号,signal,sigaction,kill,sigqueue,settimer,sigmask,sigprocmask,sigset_t 1       信

浅谈小波分析

小波的发展历史与驱动 傅里叶变换 短时傅里叶变换 小波变换 傅里叶变换 小波变换 三种变换的对比 小波变换 离散小波变换 连续小波变换 小波的多分辨率阐述 信号空间 尺度函数 多分辨率分析 多分辨率流程 其他 突变信号与吉布斯效应 海森堡不确定原理 降维 窗口化 参考资料 本文首先介绍了从傅里叶变换到小波变换的发展史,然后着重强调了小波变换的两种作用--时频分析和多分辨率分析,最后讲了一下吉布斯效应等相关知识. 小波的发展历史与驱动 傅里叶变换 FT(傅里叶变换),通过将信号分解成正余弦函数(把

小波变换-完美通俗解读

小波变换和motion信号处理一 这是<小波变换和motion信号处理>系列的第一篇基础普及.第 二篇我准备写深入小波的东西第三篇讲解应用. 记得我还在大四的时候在申请出国和保研中犹豫了好一阵骨子里 的保守最后让我选择了先保研.当然后来也退学了不过这是后话. 当时保研就要找老板实验室自己运气还不错进了一个在本校很 牛逼的实验室干活路.我们实验室主要是搞图像的实力在全国也是 很强的进去后和师兄师姐聊大家都在搞什么小波变换H264之 类的.当时的我心思都不在这方面尽搞

linux作业六——进程的描述和进程的创建

进程的描述和进程的创建 一.进程描述符task_struct 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. 代码关键点: 1.Struct list_head task进程链表,双向循环链表链接. 2.Struct mm_struct *mm,*active_mm进程地址空间,内存管理 3.每个进程都有自己独立的4G进程地址空间. 4.Struct thread Struct thread当前任务相关的CPU代码 5.Struct fs_Struct

数字信号处理实验(零)&mdash;&mdash; 一维声音信号处理和二维图像处理

一.在matlab下声音信号的I/O 1.读wav文件函数 ?y = wavread('filename') ?[y,Fs,bits] = wavread('filename') ?[...] = wavread('filename',N) ?[...] = wavread('filename',[N1 N2])   2.写wav文件函数 ?wavwrite(y,'filename') ?wavwrite(y,Fs,'filename') ?wavwrite(y,Fs,N,'filename')

数字信号处理(二)

一.滤波基础 二.差分方程 1.定义 2.解差分方程 (1) %解差分方程 y[n]-0.95y[n-1]+0.9025y[n-2]=1/3[x[n]+x[n-1]+x[n-2]], n>=0 % x[n]=cos(pin/3), y[-1]=-2, y[-2]=-3, x[-1]=1, x[-2]=1 b=[1,1,1]/3; a=[1,-0.95, 0.9025]; Y=[-2,-3]; X=[1,1]; xic=filtic(b,a,Y,X) bxplus=[1,-0.5]; axplus

Linux信号、信号处理和信号处理函数

信号(signal)是一种软件中断,它提供了一种处理异步事件的方法,也是进程间惟一的异步通信方式.在Linux系统中,根据POSIX标准扩展以后的信号机制,不仅可以用来通知某种程序发生了什么事件,还可以给进程传递数据. 一.信号的来源 信号的来源可以有很多种试,按照产生条件的不同可以分为硬件和软件两种. 1.  硬件方式 当用户在终端上按下某键时,将产生信号.如按下组合键后将产生一个SIGINT信号. 硬件异常产生信号:除数据.无效的存储访问等.这些事件通常由硬件(如:CPU)检测到,并将其通知

算法系列之二十三:离散傅立叶变换之音频播放与频谱显示

算法系列之二十三:离散傅立叶变换之音频播放与频谱显示 算法系列之二十三离散傅立叶变换之音频播放与频谱显示 导语 什么是频谱 1 频谱的原理 2 频谱的选择 3 频谱的计算 显示动态频谱 1 实现方法 2 杂项说明 结果展示 导语 频谱和均衡器,几乎是媒体播放程序的必备物件,没有这两个功能的媒体播放程序会被认为不够专业,现在主流的播放器都具备这两个功能,foobar 2000的十八段均衡器就曾经让很多人着迷.在上一篇对离散傅立叶变换介绍的基础上,本篇就进一步介绍一下频谱是怎么回事儿,下一篇继续介绍

信号处理必读的文章(-)—傅里叶分析之掐死教程(完整版)_转载至知乎

傅里叶分析之掐死教程(完整版)更新于2014.06.06 http://zhuanlan.zhihu.com/p/19763358 作 者:韩 昊 知 乎:Heinrich 微 博:@花生油工人 知乎专栏:与时间无关的故事 谨以此文献给大连海事大学的吴楠老师,柳晓鸣老师,王新年老师以及张晶泊老师. 转载的同学请保留上面这句话,谢谢.如果还能保留文章来源就更感激不尽了. ——更新于2014.6.6,想直接看更新的同学可以直接跳到第四章———— 我保证这篇文章和你以前看过的所有文章都不同,这是12年