sigsuspend()函数作用详解_西风 sigusr1信号详解

看到网上大部分解释都是抄来抄去的,结果说不清楚,最后还是不理解,于是花了几个小时研究了下,感觉大体上明白了。希望本文能对你有用处。

1)头文件:#include <signal.h>

2)一个保护临界区代码的错误实例:(sigprocmask()和pause()实现)

#include <unistd.h>

#include <signal.h>

#include <stdio.h>

void handler(intsig)//信号处理函数的实现

{

printf("SIGINT sig");

}

int main()

{

sigset_tnew,old;

structsigaction act;

act.sa_handler = handler; //信号处理函数handler

sigemptyset(&act.sa_mask);

act.sa_flags = 0;

sigaction(SIGINT, &act, 0);//准备捕捉SIGINT信号

sigemptyset(&new);

sigaddset(&new, SIGINT);

sigprocmask(SIG_BLOCK, &new,&old);//将SIGINT信号阻塞,同时保存当前信号集

printf("Blocked");

sigprocmask(SIG_SETMASK, &old,NULL); //取消阻塞

pause();

return0;

}

上面实例的问题是:本来期望pause()之后,来SIGINT信号,可以结束程序;可是,如果当“取消阻塞”和“pause”之间,正好来了SIGINT信号,结果程序因为pause的原因会一直挂起。。。

解决的方式,当然是sigsuspend()函数了。

3)使用sigsuspend()的程序

sigsuspend()函数作用详解_西风 sigusr1信号详解

#include <unistd.h>

#include <signal.h>

#include <stdio.h>

void handler(int sig)//信号处理程序

{

if(sig == SIGINT)

printf("SIGINT sig");

else if(sig == SIGQUIT)

printf("SIGQUIT sig");

else

printf("SIGUSR1 sig");

}

int main()

{

sigset_tnew,old,wait; //三个信号集

structsigaction act;

act.sa_handler = handler;

sigemptyset(&act.sa_mask);

act.sa_flags = 0;

sigaction(SIGINT, &act,0);//可以捕捉以下三个信号:SIGINT/SIGQUIT/SIGUSR1

sigaction(SIGQUIT, &act, 0);

sigaction(SIGUSR1, &act, 0);

sigemptyset(&new);

sigaddset(&new,SIGINT); //SIGINT信号加入到new信号集中

sigemptyset(&wait);

sigaddset(&wait, SIGUSR1);//SIGUSR1信号加入wait

sigprocmask(SIG_BLOCK, &new,&old);//将SIGINT阻塞,保存当前信号集到old中

//临界区代码执行

if(sigsuspend(&wait) != -1)//程序在此处挂起;用wait信号集替换new信号集。即:过来SIGUSR1信号,阻塞掉,程序继续挂起;过来其他信号,例如SIGINT,则会唤醒程序。执行sigsuspend的原子操作。注意:如果“sigaddset(&wait,SIGUSR1);”这句没有,则此处不会阻塞任何信号,即过来任何信号均会唤醒程序。

printf("sigsuspend error");

printf("Aftersigsuspend");

sigprocmask(SIG_SETMASK, &old, NULL);

return0;

}

sigsuspend的原子操作是:

(1)设置新的mask阻塞当前进程(上面是用wait替换new,即阻塞SIGUSR1信号)

(2)收到SIGUSR1信号,阻塞,程序继续挂起;收到其他信号,恢复原先的mask(即包含SIGINT信号的)。

(3)调用该进程设置的信号处理函数(程序中如果先来SIGUSR1信号,然后过来SIGINT信号,则信号处理函数会调用两次,打印不同的内容。第一次打印SIGINT,第二次打印SIGUSR1,因为SIGUSR1是前面阻塞的)

(4)待信号处理函数返回,sigsuspend返回了。(sigsuspend将捕捉信号和信号处理函数集成到一起了)

  

爱华网本文地址 » http://www.413yy.cn/a/25101018/370562.html

更多阅读

VMware虚拟机文件夹中各文件作用详解 vmware虚拟机

VMware虚拟机文件夹中各文件作用详解虚拟机的文件管理由VMware Workstation来执行。一个虚拟机一般以一系列文件的形式储存在宿主机中,这些文件一般在由workstation为虚拟机所创建的那个目录中。这里列出了这些关键文件及其扩展名。

烟台大学及周边百度地图详解 百度地图 周边搜索

我是烟台大学的大二男学生,我的专业是国际贸易。为了使下一学期的大一新生能够对“烟大德语联盟”有了解,产生一定的感情,人有时候总是对老熟的东西有所钟爱,进入烟台大学后,会努力寻找“烟大德语联盟”的身影,于是我决定为未来的大一新生

RSI和CCI指标用法详解 期货cci指标详解

RSI和CCI指标用法详解相对强弱指标:RSI (Relative Strenth Index)    一、RSI的原理    强弱指标理论认为,任何市价的大涨或大跌,均在0-100之间变动,根据常态分配,认为RSI值多在30-70之间变动,通常80甚至90时被认为市场已到达

影评 《皇家赌场》剧情详解 缅甸皇家国际赌场

是部好电影。抛开007系列电影的历史不看,单单分析这部电影。详解剧情。背景是詹姆斯·邦德还不是最厉害的00号特工,他成为00号特工的条件是杀两个人。所以影片开头他潜入了一个叛徒的住所,将他杀了。由对话知他之前杀了叛徒的线人(黑

声明:《sigsuspend()函数作用详解_西风 sigusr1信号详解》为网友册刂除记忆分享!如侵犯到您的合法权益请联系我们删除