加入收藏 | 设为首页 | 会员中心 | 我要投稿 温州站长网 (https://www.0577zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

信号实现父子进程之间的同步:sigsuspend的作用

发布时间:2016-09-21 22:57:25 所属栏目:Linux 来源:站长网
导读:副标题#e# 函数原型: #include signal.h> int sigsuspend(const sigset_t *mask); 作用: 用于在接收到某个信号之前,临时用mask替换进程的信号掩码,并暂停进程执行,直到收到信号为止。 The sigsuspend() function replaces the current signal mask of

结果:

$a.out
in critical region: SIGINT    
^C    
in sig_int: SIGINT    
after return from sigsuspend: SIGINT

如果按照sig_handler先返回,那么SIGINT是不该被打印出来的,因为那时屏蔽字还没有恢复,所有信号都是不阻塞的。那么是Stevens说错了么?当然没有,只是Stevens没有说请在sigsuspend的原子操作中到底做了什么?

sigsuspend的整个原子操作过程为:

(1) 设置新的mask阻塞当前进程;

(2) 收到信号,恢复原先mask;

(3) 调用该进程设置的信号处理函数;

(4) 待信号处理函数返回后,sigsuspend返回。

#include <stdio.h>  
#include <signal.h>
void checkset();
void func();
void main()
{
sigset_tblockset,oldblockset,zeroset,pendmask;
printf("pid:%ldn",(long)getpid());
signal(SIGINT,func);
sigemptyset(&blockset);
sigemptyset(&zeroset);
sigaddset(&blockset,SIGINT);
sigprocmask(SIG_SETMASK,&blockset,&oldblockset);
checkset();
sigpending(&pendmask);
if(sigismember(&pendmask,SIGINT))
printf("SIGINTpendingn");
if(sigsuspend(&zeroset)!= -1)
{
printf("sigsuspenderrorn");
exit(0);
}
printf("afterreturnn");
sigprocmask(SIG_SETMASK,&oldblockset,NULL);
printf("SIGINTunblockedn");
}
void checkset()
{ sigset_tset;
printf("checksetstart:n");
if(sigprocmask(0,NULL,&set)<0)
{
printf("checksetsigprocmask error!!n");
exit(0);
}
if(sigismember(&set,SIGINT))
printf("sigintn");
if(sigismember(&set,SIGTSTP))
printf("sigtstpn");
if(sigismember(&set,SIGTERM))
printf("sigtermn");
printf("checksetendn");
}
void func()
{
printf("hellofuncn");
}

信号实现父子进程之间的同步:sigsuspend的作用

(编辑:温州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读