mmap映射0地址

#include <stdio.h>

int main(void)
{
        int *p = 0;

        printf("%d\n", *p);
        return 0;
}

上面的代码,肯定会报段错误,原因是一般进程内0地址都是没有映射的。

在一些系统中,可能会因为边界条件遇到指针(地址)为0的情况,一旦发生段错误,则进程退出或挂起(signal handler)。

其实我们可以把0地址映射一下,这样虽然严格意义来讲逻辑不对,但是至少进程不会挂起

#include <stdio.h>
#include <sys/mman.h>

int main(void)
{
        int *p = 0;
        int *rv = mmap(0x0, 0x1000, PROT_READ, MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED, -1, 0);

        printf("rv = %x\n", (unsigned int)rv);
        printf("%d\n", *p);
        return 0;
}

请注意要使用root账户执行mmap,普通账户调用mmap会返回失败

posted @ 2017-03-30 12:55  redstar9451  阅读(292)  评论(0编辑  收藏  举报