以下是指SuSE 11.4 Linux。
当我的多进程软件在服务器上启动时,C times()函数的返回值将作为整数保存在共享内存中。 (没关系,因为我们在C11之前)。之后,调用 times()来获取任务的开始和结束时间。例如,将开始时间计算为自最初调用 times()以来的时间量,并以相同的方式计算结束时间。之后,可以采用开始时间和结束时间之间的差值来计算任务的持续时间。
以前,我们仅使用32位进程。对于下一个版本,我们计划在同一服务器上同时运行32位和64位进程。但是, times()似乎有冲突的结果。
根据文档, times()返回自过去任意点以来的持续时间。我发现过去的起点有所不同,具体取决于该进程是构建为32位还是64位可执行文件。
考虑以下代码:
#include <time.h>
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
#include <unistd.h>
clock_t getTimes()
{
clock_t c = times(0);
int64_t c_int64_t = (int64_t)c & 0x00000000FFFFFFFF;
printf("c_int64_t is [%" PRId64 "]\n", c_int64_t);
return c;
}
int main(void)
{
printf("sizeof(clock_t) is [%d]\n", sizeof(clock_t));
clock_t c1 = getTimes();
printf("sleeping for 2 seconds...\n");
sleep(2);
clock_t c2 = getTimes();
double elapsedTime = ((double) (c2 - c1)) / (double)sysconf(_SC_CLK_TCK);
printf("elapsedTime is [%f]\n", elapsedTime);
return 0;
}
我将其编译如下:
$ gcc -m32 -oa.32.out clock.c
$ gcc –m64 -oa.64.out clock.c
请注意当我运行4次时会发生什么:
$ for i in a.32.out a.64.out a.32.out a.64.out
> do
> echo " "
> ./${i}
> done
sizeof(clock_t) is [4]
c_int64_t is [2286152112]
sleeping for 2 seconds...
c_int64_t is [2286152312]
elapsedTime is [2.000000]
sizeof(clock_t) is [8]
c_int64_t is [2286295196]
sleeping for 2 seconds...
c_int64_t is [2286295396]
elapsedTime is [2.000000]
sizeof(clock_t) is [4]
c_int64_t is [2286152512]
sleeping for 2 seconds...
c_int64_t is [2286152712]
elapsedTime is [2.000000]
sizeof(clock_t) is [8]
c_int64_t is [2286295597]
sleeping for 2 seconds...
c_int64_t is [2286295797]
elapsedTime is [2.000000]
正如我希望从结果中清楚看到的那样,32位和64位进程彼此之间是一致的。但是它们彼此之间相差约142,885个单位(或1429秒)。结果是我的软件无法在64位和32位进程之间共享“基本时间”。
times()的这种行为是否正常且正常?