免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: xxldc
打印 上一主题 下一主题

sigsuspend到底起什么作用? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-05-05 23:19 |只看该作者
原帖由 wwdwwd 于 2009-5-5 23:01 发表

请问这个原子操作怎么个原子法?sinsuspend 不会被信号中断吗?另外,楼上的问题我还是不明白,劳烦哪位高手能给解释一下?

另外:sigpromask还没开始或者正在进行的时候信号来了应该是继续阻塞某种信号, ...

sigpromask还没开始或者正在进行的时候信号来了应该是继续阻塞某种信号这种情况sigsuspend是避免了sigpromask和pause之间的窗口时间。

论坛徽章:
0
12 [报告]
发表于 2009-05-05 23:33 |只看该作者
原帖由 cskyrain 于 2009-5-5 23:19 发表

sigpromask还没开始或者正在进行的时候信号来了应该是继续阻塞某种信号这种情况sigsuspend是避免了sigpromask和pause之间的窗口时间。

请问sigsuspend是如何避免sigpromask和pause之间的窗口时间的呢?apue里面说到在sigpromask和pause之间如果有信号来的话就会丢失,不知道为什么会丢失?

论坛徽章:
0
13 [报告]
发表于 2009-05-05 23:37 |只看该作者

回复 #1 xxldc 的帖子

首先,这只是apue上的一个例子而已,lz在看一下下一个例子中有一句
while(flag==0)
{
    sigsuspend();
}
“等待SIGUSR1的到来,为什么要等SIGUSR1?它要一直也不来,进程还不等死在那里?”
这个问题这里给了答案呵呵!!!不用解释了吧??
“我就是搞不懂,即然临界区都执行完了,也就不怕SIGUSR1了,直接 sigpromask(SIG_UNBLOCK,&newmask,&oldmask),解放SIGUSR1,继续往前走也就行了,还弄个叫人搞不懂的sigsuspend原子操作出来干什么?”
这个你在你还是要在看看apue了,中文版p269讲的就是为什么有sigsuspend这个函数了。
大概就是说:如果要访问一段临界区时,可能要阻塞一些信号的发生,推出临界区是,你可能要检测一下有什么信号在阻塞的期间发生了,所有可能要pause一下等待信号的发生,这样就有了一个窗口时间了,所以sigsuspend出现了,呵呵,这是我个人的理解,不知道有什么差错。呵呵!
不过我对这个有有点疑问,为什么要pause等待以前的信号发生呢?程序继续运行,而不pause被阻塞的信号还是会捕获的啊?我想是不是pause一下以防止程序执行完sigpromak就结束啊?等待解答!!!

论坛徽章:
0
14 [报告]
发表于 2009-05-05 23:41 |只看该作者
原帖由 wwdwwd 于 2009-5-5 23:33 发表

请问sigsuspend是如何避免sigpromask和pause之间的窗口时间的呢?apue里面说到在sigpromask和pause之间如果有信号来的话就会丢失,不知道为什么会丢失?
丢失的意思是这个信号没有被pause捕捉到,pause就一直阻塞在哪,不能返回了,假如没有其他的信号来中断pause,那他就永远阻塞在哪,进程就一直休眠了,呵呵呵

论坛徽章:
0
15 [报告]
发表于 2009-05-05 23:47 |只看该作者

回复 #12 wwdwwd 的帖子

“请问sigsuspend是如何避免sigpromask和pause之间的窗口时间的呢?”
sigsuspend把sigprocmask和pause的集成在一起做成一个原子的了!

论坛徽章:
0
16 [报告]
发表于 2009-05-06 01:52 |只看该作者
研究了一晚上,终于搞明白了,以前看书的时候没仔细想,再次看发现领悟颇多,现解答楼主以及我的疑问。


1,假设执行sigpromask只阻塞一个信号SIGUSR1,
2,然后执行书上说的不希望被SIGUSR!打断的临界区代码。(什么叫临界区,真是难理解)
3,执行完了临界区了。-------------这里的临界区指的就是不希望被某类信号打断的代码段

4,轮到sigsuspend, sigsuspend用othermask替代当前的newmask,并阻塞进程,等待SIGUSR1的到来,为什么要等SIGUSR1?它要一直也不来,进程还不等死在那里?

是得,没信号来的时候进程就是死在那里了,原因是sigsuspend就是要达到这个效果,它就是要让进程暂停,apue上举得这个例子不合适,后面的wait_parent和wait_child就比较合适了。比如wait_parent,这是子进程里的,子进程要让待父进程先执行,所以它要等,但是又不能无限期的等,得有一个信号触发它,告诉它别等了该你执行了。所以这时候子进程需要暂停并等待某一信号,但是这个信号在while之前是被阻塞的,为什么呢,因为子进程在while里面才要进行等待,要是在while之前不阻塞SIGUSR1的话,那在while之前就会触发信号处理函数,就会把flag设置为1,不会再进入while了。所以while里面需要做的是:先把SIGUSR1的阻塞去掉,然后等待此信号的到来,如果我们不用sigsuspend,而用sigprocmask(SIG_SETMASK, &oldmask, NULL) ; pause();的话就会有一个问题,在sigprocmask和pause之间如果有一个SIGUSR1信号,那么它就会触发信号处理函数,触发完之后就会接着执行pause,这时候pause会让程序暂停,这就变成了:sigprocmask解开了对SIGUSR1的阻塞,但是程序还是被暂停了。可以这样来模拟一下:sigprocmask(SIG_SETMASK, &oldmask, NULL) ;sleep(10); pause();这样应该就比较清晰了。
为什么sigsuspend就可以避免这个问题呢?看到大家老说sigsuspend是原子操作,但我一直没搞明白,我看到有人研究明白了,摘录如下:
sigsuspend的整个原子操作过程为:
(1) 设置新的mask阻塞当前进程;
(2) 收到信号,恢复原先mask;
(3) 调用该进程设置的信号处理函数;
(4) 待信号处理函数返回后,sigsuspend返回。


那么它和sigprocmask() ; pause();有啥区别呢?区别是:sigsuspend把信号捕捉及信号处理函数的调用整合在一起了,也就是说(1)设置新的mask阻塞当前进程后如果有信号我就自己收信号,调用信号处理函数了,而sigprocmask() ; pause();的问题在于它希望在pause之后收信号,而不是sigprocmask() 和pause();之间。
不知道我的解释能不能给大家解惑





6,SIGUSR1来了后,先是恢复newmask,然后执行SIGUSR1的handle,等handle执行完了,sigsuspend也就返回了。


我就是搞不懂,即然临界区都执行完了,也就不怕SIGUSR1了,直接sigpromask(SIG_UNBLOCK,&newmask,&oldmask),解放SIGUSR1,继续往前走也就行了,还弄个叫人搞不懂的sigsuspend原子操作出来干什么?

另外我觉得sigpromask(SIG_UNBLOCK,&newmask,&oldmask)和sigpromask(SIG_SETMASK,&oldmask,NULL),这两个没什么差别,都是恢复原来的阻塞信号集。是我理解错了?

另外,别叫我去看书,书看不懂才来问的

论坛徽章:
0
17 [报告]
发表于 2009-05-06 01:54 |只看该作者
原帖由 cskyrain 于 2009-5-5 23:37 发表
首先,这只是apue上的一个例子而已,lz在看一下下一个例子中有一句
while(flag==0)
{
    sigsuspend();
}
“等待SIGUSR1的到来,为什么要等SIGUSR1?它要一直也不来,进程还不等死在那里?”
这个问 ...

cskyrain兄,这里的业务要求就是要让程序暂停,或者说当有这样的业务要求时才考虑使用sigsuspend

论坛徽章:
0
18 [报告]
发表于 2009-05-06 17:44 |只看该作者
临时设置掩码并阻塞,就是为了防信号在阻塞前发生的,用pause(),程序就死了

论坛徽章:
0
19 [报告]
发表于 2012-05-21 20:25 |只看该作者
回复 7# BLZer
sigsuspend是等待特定的信号,还是任意的一个信号都会引起他的操作啊 ?


   

论坛徽章:
0
20 [报告]
发表于 2013-01-15 10:06 |只看该作者
回复 19# unixerrrrr


    等待除了sigsuspend(&mask)里的mask阻塞的其他所有信号,一般是用sigsuspend(&oldmask)来等待以前用sigprocmask(SIG_BLOCK,&newmask,&oldmask)的newmask阻塞的信号
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP