• mmap映射0地址


    #include <stdio.h>
    
    int main(void)
    {
            int *p = 0;
    
            printf("%d
    ", *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
    ", (unsigned int)rv);
            printf("%d
    ", *p);
            return 0;
    }

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

  • 相关阅读:
    List中的get(i)
    报空指针异常
    json数据请求
    springmvc中的字典表
    json的解析
    httpClient返回的数据类型,怎么弄
    java中webService
    红外遥控协议(NEC)
    很奇怪的GPIO地址
    emacs命令备忘
  • 原文地址:https://www.cnblogs.com/redstar9451/p/6645579.html
Copyright © 2020-2023  润新知