关于Linux C - UUID

时间:2012-04-18 08:43:43

标签: c linux uuid

#include <stdio.h>
#include <stdlib.h>  
#include <uuid/uuid.h>

int main(void) {
    puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
    uuid_t uuid;
    int uuid_generate_time_safe(uuid);
    printf("%x",uuid);
    return EXIT_SUCCESS;
}

我只是想知道为什么uuid不是16字节长? 我用DEBUG查看内存,确实不是16字节。 我使用libpcap来开发我的程序,uuid并不是唯一的。

1 个答案:

答案 0 :(得分:11)

我刚刚在我的系统上尝试过您的程序,uuid 16个字节。但是你的程序没有显示它的大小。

该行:

int uuid_generate_time_safe(uuid);

不是对uuid_generate_time_safe函数的调用,它是该函数的声明uuid作为单个参数的(忽略)名称。 (而且这种函数声明在1999年的标准中甚至没有效率,它取消了旧的“隐式int”规则。)

您的printf来电:

printf("%x",uuid);

有未定义的行为; "%x"需要unsigned int类型的参数。

如果您查看/usr/include/uuid/uuid.h,您会看到uuid_t的定义是:

typedef unsigned char uuid_t[16];

uuid_generate_time_safe(见man uuid_generate_time_safe)的正确声明是:

int uuid_generate_time_safe(uuid_t out);

您不需要在自己的代码中声明;它由#include <uuid/uuid.h>提供。 因为uuid_t是一个数组类型,所以参数实际上是unsigned char*类型,这就是函数看似能够修改其参数的原因。

这是一个更正确的程序,用于说明函数的使用:

#include <stdio.h>
#include <uuid/uuid.h>

int main(void) {
    uuid_t uuid;
    int result = uuid_generate_time_safe(uuid);
    printf("sizeof uuid = %d\n", (int)sizeof uuid);
    // or: printf("sizeof uuid = %zu\n", sizeof uuid);
    if (result == 0) {
        puts("uuid generated safely");
    }
    else {
        puts("uuid not generated safely");
    }
    for (size_t i = 0; i < sizeof uuid; i ++) {
        printf("%02x ", uuid[i]);
    }
    putchar('\n');
    return 0;
}

在我的系统上,我得到以下输出:

sizeof uuid = 16
uuid not generated safely
26 9b fc b8 89 35 11 e1 96 30 00 13 20 db 0a c4

有关“uuid未安全生成”消息可能出现原因的信息,请参见手册页。

请注意,我必须安装uuid-dev包才能构建和运行此程序。