c -/dev/urandom 为 mmap() 提供随机地址

标签 c linux posix

即使我使用的是/dev/urandom,在调用该函数 4 次后,我仍然得到相同的地址位置。这是为什么 ?为什么/dev/urandom 提供的数字非常低或非常高?

104
0x7fffb128de78
0x7f9e3c565000
4294967192
0x7fffb128de78
0x7f9e3c564000
97
0x7fffb128de78
0x7f9e3c563000
4294967139
0x7fffb128de78
0x7f9e3c562000
void test(void){
    char random[4];
    int filedescriptor = open("/dev/urandom", O_RDONLY);
    read(filedescriptor, random, 4);
    close(filedescriptor);

    unsigned int hintmemoryaddress = (unsigned int)random;
printf("%u\n", hintmemoryaddress);

    char *p = (char *)hintmemoryaddress;
    p += hintmemoryaddress;
printf("%p\n", &p);

    char *x = (char *)mmap((void *)&p, 1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
printf("%p\n", x);
}

int main(void){
    test();
    test();
    test();
    test();

    return 0;
}

最佳答案

因为您将指针的值与其地址混淆了。您要使用 p,而不是 &p。此外,temp char 数组是无用的,您将其复制到周围都是不正确的。更正后的代码应该是:

void test(void){
    void *p;
    int filedescriptor = open("/dev/urandom", O_RDONLY);
    read(filedescriptor, &p, sizeof p);
    close(filedescriptor);

    char *x = (char *)mmap(p, 1000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    printf("%p\n", x);
}

关于c -/dev/urandom 为 mmap() 提供随机地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17253514/

相关文章:

shell - 我怎样才能制作一个 "read-only variable"?

c - 如何将多个结构实例存储在共享内存中?

c - 如何清除C中数组的所有元素?

c - 如何从套接字读取无符号字符

c - 在 C 中是否存在内存溢出或覆盖的情况?

linux - 根据条件将 bash 中的 CSV 文件拆分为多个文件

c - 为什么调用 printf 会导致 main 的不同函数序言?

c++ - fileno, errno : What does the "no" mean?(非母语英语)

android - 在 Linux/Android 上检查从另一个共享库加载的共享库

linux - FUSE的写顺序保证