进程的内存映射

2019-05-30  本文已影响0人  54c1eca7148a

1、如何查看一个进程的内存映射?

    使用:cat  /proc/进程的pid/maps(进程的pid获取见getpid函数)

用户空间结构

    例:

    char buf[]="aaaaa";

    char *str="aaaaa";

    printf("buf%p\n",buf);//输出字符串数组的首地址

    printf("str's addr=%p\n",&str);

    printf("str's comt=%p\n",str);

上一段代码在用户空间内存中的映射

这里需要注意,局部变量,函数形参被分配到栈,静态的局部变量和全局变量在数据段中,字符串在代码段中,使用malloc等申请的空间分配在堆中。buf[]中的字符串内容和str指向的字符串内容虽然都是“aaaaa”。但是buf[]中的内容是程序在执行的时候,将“aaaaa”拷贝到buf[]中的。也就是说buf[]中存在实实在在的字符串数据。

(1)同时,也可以看出初始化和赋值的区别。如:

       在上述语句中,将char buf[]="aaaaa";改为char buf[12];

      增加  buf="aaaaa";

这句语句将代码段的“aaaaa”首地址赋值给buf,即让buf指向代码段字符串,而本身buf是指向栈中的字符串的,buf是一个固定的常量,不能被赋值,而str这种指针变量可以被赋值改变指向的地址。而初始化就如同上述,将字符串拷贝到buf[]中,而不是改变buf所指地址。如要实现赋值拷贝,可以使用strcpy函数。

(2)另外:   

    如有以下定义:char *p;*p='m';

   因为指针还未进行初始化或者赋值,p是一个悬空指针。为非法地址。编译可以通过,但是无法执行。 

(3)有如下子函数

        void count(void){

            int c=1;

            static int c1=1;

            c++;

            c1++;

             printf("c=%d,%d\n",c,c1);

            printf("c addr=%p\n",&c,&c1);

            return;

        }

    在主函数中使用for循环调用6次count函数,使用cat查看maps文件内的内存映射,可以看到c被分配到栈段,c1被分配到数据段。故生命周期不同。如下图所示

count程序变量内存映射

2、获取进程信息

获取进程的ID号:

    pid_t  getpid(void);

功能:

    获取进程的pid

参数:

    void 

返回值

    调用进程的pid

包含头文件:#include<sys/types.h>、#include<unistd.h>

上一篇 下一篇

猜你喜欢

热点阅读