免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 20650 | 回复: 19
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-05 01:33 |只看该作者 |倒序浏览
看了apue举的例子,又google半天,看了若干看不懂的分析,还是没有搞懂sigsuspend在干什么?

sigset_t newmask,oldmask,othermask,
sigaddset(&newmask,SIGUSR1);
sigpromask(SIG_BLOCK,&newmask,&oldmask);
....临界区代码....
sigsuspend(&othermask);
sigpromask(SIG_SETMASK,&oldmask,NULL);

1,假设执行sigpromask只阻塞一个信号SIGUSR1,
2,然后执行书上说的不希望被SIGUSR!打断的临界区代码。(什么叫临界区,真是难理解)
3,执行完了临界区了。
4,轮到sigsuspend, sigsuspend用othermask替代当前的newmask,并阻塞进程,等待SIGUSR1的到来,为什么要等SIGUSR1?它要一直也不来,进程还不等死在那里?
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),这两个没什么差别,都是恢复原来的阻塞信号集。是我理解错了?

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

[ 本帖最后由 xxldc 于 2007-11-5 01:34 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-01-04 13:24 |只看该作者
另外我觉得sigpromask(SIG_UNBLOCK,&newmask,&oldmask)和sigpromask(SIG_SETMASK,&oldmask,NULL),这两个没什么差别,都是恢复原来的阻塞信号集。是我理解错了?

这是不同的
sigpromask(SIG_UNBLOCK,&newmask,&oldmask)
    它的作用有两个:一是设置新的信号掩码(不阻塞newmask所指的信号集).二是保存原来的信号掩码(放在oldmask所指的信号集中)
sigpromask(SIG_SETMASK,&oldmask,NULL)
    它的作用只有一个:设置新的信号掩码(信号掩码为oldmask所指的信号集)

论坛徽章:
0
3 [报告]
发表于 2008-05-16 01:20 |只看该作者
SIG_SET、SIG_BLOCK和SIG_UNBLOCK都是设置信号掩码的一种方式,SIG_SET是把新掩码设置给进程,SIG_BLOCK是把新掩码加入到进程当前掩码中,SIG_UNBLOCK是把新掩码从当前掩码中除去。无论哪一种方式,如果设置的掩码使得未决的信号不再阻塞,则在sigprocmask()返回前将其投递给进程。

论坛徽章:
0
4 [报告]
发表于 2008-05-16 13:26 |只看该作者
这是一个极其有用的函数。

当你真的想用信号做点什么事情的时候,多半会用到它。

有很多问题代码的BUG就在于该用sigsuspend的时候误用了pause。

论坛徽章:
0
5 [报告]
发表于 2008-10-09 22:15 |只看该作者
原帖由 xxldc 于 2007-11-5 01:33 发表
看了apue举的例子,又google半天,看了若干看不懂的分析,还是没有搞懂sigsuspend在干什么?

sigset_t newmask,oldmask,othermask,
sigaddset(&newmask,SIGUSR1);
sigpromask(SIG_BLOCK,&newmask,&oldmask ...


有没有CU朋友能解释一下呀,LZ问的一些问题我也是一头雾水!!

论坛徽章:
0
6 [报告]
发表于 2008-10-10 02:47 |只看该作者
看man手册.

论坛徽章:
0
7 [报告]
发表于 2008-10-10 09:10 |只看该作者
原帖由 xxldc 于 2007-11-5 01:33 发表
看了apue举的例子,又google半天,看了若干看不懂的分析,还是没有搞懂sigsuspend在干什么?

sigset_t newmask,oldmask,othermask,
sigaddset(&newmask,SIGUSR1);
sigpromask(SIG_BLOCK,&newmask,&oldmask ...

apue里写的很明白了啊,

int sigsuspend(const sigset_t *sigmask)
就是临时用sigmask代替当前信号屏蔽字,

然后等待特定信号发生

接受到特定信号后,

将屏蔽字恢复为原来的

论坛徽章:
0
8 [报告]
发表于 2008-10-10 10:00 |只看该作者
"
我就是搞不懂,即然临界区都执行完了,也就不怕SIGUSR1了,直接sigpromask(SIG_UNBLOCK,&newmask,&oldmask),解放SIGUSR1,继续往前走也就行了,还弄个叫人搞不懂的sigsuspend原子操作出来干什么?
"

同问,这一点我一直也不是太清楚!!!

论坛徽章:
0
9 [报告]
发表于 2008-10-10 11:05 |只看该作者
那你有没有想过,在临界区刚执行完,sigpromask还没开始或者正在进行的时候信号来了怎么办啊?
所以,要加个原子操作。。。。。sinsuspend

论坛徽章:
0
10 [报告]
发表于 2009-05-05 23:01 |只看该作者
原帖由 alexhappy 于 2008-10-10 11:05 发表
那你有没有想过,在临界区刚执行完,sigpromask还没开始或者正在进行的时候信号来了怎么办啊?
所以,要加个原子操作。。。。。sinsuspend

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

另外:sigpromask还没开始或者正在进行的时候信号来了应该是继续阻塞某种信号,等待sigpromask执行完之后再调用信号处理函数吧?
我也跟楼主一样,完全搞不明白为什么要用sinsuspend ,不用它会导致什么问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP