使用sleep()函数计算进程何时唤醒的正确方法



我正在读一本教科书,里面有一个练习:

编写一个睡眠包装函数,称为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保证对于例程的任何非正常退出都有一个非零结果。

最新更新