- 论坛徽章:
- 0
|
看了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 编辑 ] |
|