日期:2014-05-16  浏览次数:20578 次

unix环境高级编程 第十章十九节sleep函数实现为什么要先阻塞SIGALRM?
unix环境高级编程   第十章十九节sleep函数实现为什么要先阻塞SIGALRM??


------解决方案--------------------
帖代码,,
不想自己翻书
------解决方案--------------------
10.4,10.5都是有错误的例子,说明都很清楚,在alarm后pause之间存在时间窗口,极有可能在pause之前SIGALRM已被投递处理完毕,之后将会永远睡在pause上。

所以后面用了可靠的实现,即sigsuspend函数,首先阻塞SIGALRM,此后SIGALRM可以投递但不会被处理,之后alarm定时,最后sigsuspend原子的解除SIGALRM阻塞并挂起。 在SIGALRM投递后或者SIGALRM投递前有其他信号被处理, 均可以让sigsuspend返回,此时调用alarm(0)得到剩余的定时器时间,因为可能是非SIGALRM中断的sigsuspend。