第十章
10-1 假设一个系统调用sysconf(_SC_CLK_TCK)返回的值是100。假设times()返回的clock_t的值是一个无符号的32位整数,需要多久这个值才能进入下一个从0开始的周期?对clock()返回的CLOCKS_PER_SEC值执行相同的计算。
sysconf(_SC_CLK_TCK)可以获得每秒包含的时钟计时单元数。假设返回的值是x,则溢出需要的值是2^32-x,时间就是(2^32-x)/100秒钟。同样的,如果clock()返回的是x,CLOCKS_PER_SEC返回的是y,则clock函数溢出的时间是(2^32-x)/y秒钟。
我们写出如下的程序来验证我们的想法,但是注意的是,times函数返回真实时间,而clock函数返回的调度进程所花费的时间。这意味着不能使用sleep函数来使得clock返回值增加,但是却可以增加times的值。
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/times.h>
int main(void){
struct tms tm;
printf("%ld\n", sysconf(_SC_CLK_TCK));
printf("%ld\n",times(NULL));
sleep(1);
printf("%ld\n",times(NULL));
printf("%ld\n", CLOCKS_PER_SEC);
printf("%ld\n", clock());
while(clock() <1000000);
printf("%ld\n", clock());
return 0;
}
这段代码运行后如下输出:
100
1718594893
1718594993
1000000
1429
1000000
100 意味着times每秒加100,1718594893是程序刚开始times的返回值,经过sleep(1)一秒钟后,times的返回值增加了100。然后1000000是clock每秒钟增加的数值,1429是clock的返回值,这个值很小,因为之前时间都花在了sleep上面,程序得到调度的时间几乎没有。这意味着运行到这里的clock返回了很小的值。然后程序经过死循环,等待clock增加到1000000,差不多是1s钟的时间,最后一个1000000是打印最后加到1000000的时候的值,可以看到没有变化。