uc笔记03---环境变量,内存管理,进程映像/堆栈区别,虚拟内存,malloc 特点

本文详细介绍了Linux环境变量的查看、设置与管理,包括`getenv`、`putenv`、`setenv`和`unsetenv`函数的使用。接着讨论了内存管理的不同层次,从STL、C++的`new/delete`、C语言的`malloc/free`到操作系统层面的`brk/sbrk`和`mmap/munmap`。此外,还讲解了进程映像、堆栈的区别以及虚拟内存的概念,强调了动态分配内存时控制信息的重要性。最后,通过示例展示了如何使用`sbrk`和`brk`进行内存分配和释放,并给出了自行实现`malloc`的思路。
摘要由CSDN通过智能技术生成
1.    环境变量
    #env        // 查看环境变量
    
    环境表
    1) 每个程序都会接收到一张环境表,
       是一个以 NULL 指针结尾的字符指针数组。

    2) 全局变量 environ 保存环境表的起始地址。
                +---+
     environ -> | * --> HOME=/root
                +---+
                | * --> SHELL=/bin/bash
                +---+
                | * --> PATH=/bin:/usr/bin:...:.
                +---+
                 | . |
                 | . |
                 | . |
                +---+
                 | 0 |

    图示:env_list.bmp
    范例:env.c
        #include <stdio.h>
        void printenv () {
            extern char** environ;            // 不是定义,只是声明,名字只能写 environ;
            char** env;
            for (env = environ; env && *env; ++env)
                printf ("%s\n", *env);
        }
        int main () {
            char env[256];
            const char* name = "MYNAME";
            sprintf (env, "%s=minwei", name);
            putenv (env);
            printf("%s=%s\n", name, getenv (name));
            
            sprintf (env, "%s=beijing", name);
            putenv (env);
            printf("%s=%s\n", name, getenv (name));
            
            setenv (name, "minwei", 0);        // 如果存在,不覆盖;
            printf("%s=%s\n", name, getenv (name));
            
            printenv ();
            return 0;
        }

2.     环境变量函数

    #include <stdlib.h>

    环境变量:name=value

    getenv   - 根据 name 获得 value。
    putenv   - 以 name=value 的形式设置环境变量,
               name 不存在就添加,存在就覆盖其 value。
    setenv   - 根据 name 设置 value,不存在就添加;注意最后一个参数表示,
                最后一个参数为 0:若 name 已存,不覆盖其 value;
                最后一个参数为 1:若 name 已存,覆盖其 value;
    unsetenv - 删除一个环境变量。
    clearenv - 清空环境变量,environ==NULL。
    
    上面这些环境变量函数,都是改变本进程的环境变量,不会改变系统 shell 的环境变量;
    当程序结束时,设置的所有环境变量也都将失效。

    范例:env.c
        #include <stdio.h>
        void printenv () {
            extern char** environ;            // 不是定义,只是声明,名字只能写 environ;
            char** env;
            for (env = environ; env && *env; ++env)
                printf ("%s\n", *env);
        }
        int main () {
            char env[256];
            const char* name = "MYNAME";
            sprintf (env, "%s=minwei", name);
            putenv (env);
            printf("%s=%s\n", name, getenv (name));
            
            sprintf (env, "%s=beijing", name);
            putenv (env);
            printf("%s=%s\n", name, getenv (name));
            
            setenv (name, "minwei", 0);        // 如果存在,不覆盖;
            printf("%s=%s\n", name, getenv (name));
            
            setenv (name, "minwei", 1);        // 如果存在,覆盖;
            printf("%s=%s\n", name, getenv (name));
            
            unsetenv (name);

            return 0;
        }

3.    内存管理

    +----+--------+----------------------------+----------+
        STL        自动分配/释放内存资源            调C++
        C++        new/delete,构造/析构            调标C
         标C            malloc/calloc/realloc/free    调POSIX
        POSIX        brk/sbrk                        调Linux
         Linux        mmap/munmap                    调Kernel
    +----+--------+----------------------------+----------+
        Kernel        kmalloc/vmalloc                调Driver
        Driver        get_free_page                    ...
         . . .          . . .                                . . .
    +----+--------+----------------------------+----------+

4.    进程映像
    1)程序是保存在磁盘上的可执行文件。

    2)运行程序时,需要将可执行文件加载到内存,形成进程。

    3)一个程序(文件)可以同时存在多个进程(内存)。

    4)进程在内存空间中的布局就是进程映像。
    从高地址到低地址依次为:
    
        ===============================================================
        命令行参数与环境区:
            命令行参数和环境变量;
        ---------------------------------------------------------
        栈区(stack):0xbf
            非静态局部变量,包括函数的参数和返回值;从高地址向低地址扩展;        /* 所有局部(非静态)变量都位于这个区域 */
        ---------------------------------------------------------
        堆区和栈区之间存在一块间隙(shared):0x40
            一方面为堆和栈的增长预留空间,
            同时共享库、共享内存等亦位于此;
            (后面进程间通信会用到共享内存,参见 DAY09 “共享内存”)
        -------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值