当前位置: 技术问答>linux和unix
unix环境高级编程 第十章十九节sleep函数实现为什么要先阻塞SIGALRM?
来源: 互联网 发布时间:2017-03-17
本文导语: unix环境高级编程 第十章十九节sleep函数实现为什么要先阻塞SIGALRM?? | 10.4,10.5都是有错误的例子,说明都很清楚,在alarm后pause之间存在时间窗口,极有可能在pause之前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。
所以后面用了可靠的实现,即sigsuspend函数,首先阻塞SIGALRM,此后SIGALRM可以投递但不会被处理,之后alarm定时,最后sigsuspend原子的解除SIGALRM阻塞并挂起。 在SIGALRM投递后或者SIGALRM投递前有其他信号被处理, 均可以让sigsuspend返回,此时调用alarm(0)得到剩余的定时器时间,因为可能是非SIGALRM中断的sigsuspend。
|
帖代码,,
不想自己翻书
不想自己翻书