在32位和64位进程中,对C times()函数是否应该有不同的起点?

时间:2019-04-03 19:22:24

标签: c linux suse

以下是指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()的这种行为是否正常且正常?

0 个答案:

没有答案