我正在读一本教科书,里面有一个练习:
编写一个睡眠包装函数,称为
wakeup
,具有以下接口:
unsigned int wakeup(unsigned int secs);
wakeup
函数的行为与睡眠函数完全相同,只是它打印一条消息,描述进程实际唤醒的时间:4秒唤醒。
并且解决方案是:
unsigned int wakeup(unsigned int secs){
int i;
unsigned int rc = sleep(secs);
printf("Woke up at %d secs.n", secs-rc+1);
return rc;
}
但我很困惑,为什么是secs-rc+1
,不应该是secs-rc
吗?假设secs
参数为3,它在1秒时通过接收信号来恢复,那么sleep
返回2,因为它还有2秒的睡眠时间,那么进程实际上在3-2=1秒时醒来?为什么是3-2+1=2秒?
但我很困惑为什么它是secs-rc+1,它不应该是secs-rc吗
最简单地说,+1
是为了防止0
返回值的模糊性。
正如您正确观察到的,sleep((的返回状态为:
如果请求的时间已过或剩余秒数为零如果调用被信号处理程序中断,则进入睡眠状态。
因此,添加额外的1
将有助于防止函数在时间==0
发生中断时返回零值。
例如,如果secs == 3
,并且在时钟启动后立即发生中断,那么简单地具有secs=rc
将是3 - 3 == 0
。与正常出口相同。
secs-rc+1
保证对于例程的任何非正常退出都有一个非零结果。