嵌入式 sigemptyset、sigaddset、sigprocmask的用法示例

原创 2013年12月04日 22:55:18

源程序:

#include <signal.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
double y;
sigset_t intmask;
int i,repeat_factor;
if(argc!=2)
{
fprintf(stderr,"Usage:%s repeat_factor\n\a",argv[0]);
exit(1);
}
if((repeat_factor=atoi(argv[1]))<1)repeat_factor=10;
sigemptyset(&intmask); /* 将信号集合设置为空 */
sigaddset(&intmask,SIGINT); /* 加入中断 Ctrl+C 信号*/
while(1)
{
/*阻塞信号,我们不希望保存原来的集合所以参数为NULL*/
sigprocmask(SIG_BLOCK,&intmask,NULL);
fprintf(stderr,"SIGINT signal blocked\n");
for(i=0;i<repeat_factor;i++)y=sin((double)i);
fprintf(stderr,"Blocked calculation is finished\n");
/* 取消阻塞 */
sigprocmask(SIG_UNBLOCK,&intmask,NULL);
fprintf(stderr,"SIGINT signal unblocked\n");
for(i=0;i<repeat_factor;i++)y=sin((double)i);
fprintf(stderr,"Unblocked calculation is finished\n");
}
exit(0);
}

解释如下:

sigemptyset 函数初始化信号集合set,将set 设置为空.

sigfillset 也初始化信号集合,只是将信号集合设置为所有信号的集合.

sigaddset 将信号signo 加入到信号集合之中,sigdelset 将信号从信号集合中删除.

sigismember 查询信号是否在信号集合之中.s

igprocmask 是最为关键的一个函数.在使用之前要先设置好信号集合set.这个函数的作用是将指定的信号集合set 加入到进程的信号阻塞集合之中去,如果提供了oset 那么当前的进程信号阻塞集合将会保存在oset 里面.参数how 决定函数的操作方式:
SIG_BLOCK:增加一个信号集合到当前进程的阻塞集合之中.
SIG_UNBLOCK:从当前的阻塞集合之中删除一个信号集合.
SIG_SETMASK:将当前的信号集合设置为信号阻塞集合.

上述源程序,在不带参数执行时,输出是个错误的结果是:Usage:./sigset repeat_factor

带参数执行后的结果将是不断重复如下语言:

SIGINT signal blocked
Blocked calculation is finished
SIGINT signal unblocked
Unblocked calculation is finished
SIGINT signal blocked
Blocked calculation is finished
SIGINT signal unblocked
Unblocked calculation is finished
SIGINT signal blocked
Blocked calculation is finished
SIGINT signal unblocked
Unblocked calculation is finished
SIGINT signal blocked
Blocked calculation is finished
SIGINT signal unblocked
Unblocked calculation is finished
SIGINT signal blocked
Blocked calculation is finished
SIGINT signal unblocked
Unblocked calculation is finished

在输入Ctrl+c后将会停止。

相关文章推荐

sigemptyset、sigaddset、sigprocmask的用法 信号未决,信号阻塞 信号的捕捉

下图表明了在linux系统中,信号的大致关系: 下面介绍一个简单的小例程: 该例程解释如下: 先设置两个信号集参数,s  p sigemptyset是将s的信号集先清空,sigaddset就...

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

转载自:http://blog.chinaunix.net/uid-28458801-id-5032557.html 信号是与一定的进程相联系的。也就是说,一个进程可以决定在进程中对哪些信号进行...
  • I_feige
  • I_feige
  • 2016年11月29日 18:10
  • 140

sigemptyset sigfillset sigprocmask

http://blog.csdn.net/unbutun/article/details/6022852 Linux下的信号事件  前言:这一章我们讨论一下Linux下的信号处理函数. L...

嵌入式 G711A编码音频转码为AAC过程代码示例

/* Author : kj Time : 2014-09-25 Function : joseph aac, g711a changover aac */ #include ...
  • skdkjxy
  • skdkjxy
  • 2014年09月25日 20:33
  • 2911

嵌入式 sqlite3数据库创建、插入、更新、查询、删除、多线程等C编程示例以及多并发完成

/* Author : kj Time : 2014-09-07 Function : josep cvr manage by sqlite3 db */ #include #...
  • skdkjxy
  • skdkjxy
  • 2014年09月12日 19:33
  • 1341

使用嵌入式jetty在Eclipse中部署struts2示例程序struts2-blank

使用内嵌jetty在Eclipse中部署struts2示例

嵌入式测试:IAR单元测试示例

嵌入式测试通常涉及硬件的模拟与控制,需要在单元测试用例中随意模拟和控制硬件行为,以及模拟中断对全局变量的修改,并解决死循环、超时等问题。使用Visual Unit 4,通过在测试用例中设置内部输入,可...
  • dellfox
  • dellfox
  • 2014年02月26日 09:52
  • 3136

嵌入式 hi3518c看门狗驱动程序相关示例

/* 本模块支持三个加载参数:default_margin、nodeamon与nowayout。 三者的含义分别为:  (1)default_margin:指定看门狗产生中断的时间间隔,以secon...
  • skdkjxy
  • skdkjxy
  • 2013年12月03日 16:22
  • 1626

嵌入式 iptables参数说明以及使用示例小结

本文介绍25个常用的iptables用法。如果你对iptables还不甚了解,看完这篇文章,你就能明白iptables的用法和本文提到的基本术语。 一、iptables:从这里开始 删除现...
  • skdkjxy
  • skdkjxy
  • 2014年09月18日 20:57
  • 1025

嵌入式 在uboot中添加硬件看门狗小示例

2Uboot添加硬件看门狗 uboot中默认看门狗策略由两个宏CONFIG_HW_WATCHDOG和CONFIG_WATCHDOG来使能。 此策略是在代码执行中的不同阶段,添加喂狗代码。 ...
  • skdkjxy
  • skdkjxy
  • 2014年04月24日 10:40
  • 1078
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:嵌入式 sigemptyset、sigaddset、sigprocmask的用法示例
举报原因:
原因补充:

(最多只允许输入30个字)