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 “共享内存”)
-------
#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 “共享内存”)
-------