When a C program is executed by the kernel—by one of the exec functions, a special start-up routine is called before the main function is called
获取环境变量
#include <stdlib.h> char *getenv(const char *name); //Returns: pointer tovalueassociated withname,NULLif not found
设置环境变量
#include <stdlib.h> int putenv(char *);//Returns: 0 if OK, nonzero on error int setenv(const char *name,const char *value,intrewrite); int unsetenv(const char *name); //Both return: 0 if OK,−1 on error
The putenv function takes a string of the form name=valueand places it in the environment list. Ifnamealready exists, its old definition is first removed.
The setenv function sets name to value. If name already exists in the environment, then (a) if rewrite is nonzero, the existing definition fornameis first removed; or (b) if rewrite is 0, an existing definition for name is not removed, name is not set to the new value,and no error occurs
The unsetenv function removes any definition of name. It is not an error if such a definition does not exist.
共享库使得程序不再包含公用的库例程,,只需要在所有进程都可以访问的存储区维护这种库例程的一个副本。程序第一次调用某个库函数用动态链接的方式将程序和共享库函数链接,减少了可执行文件的长度,但增加了运行时间的开销。这种时间开销发生在该程序第一次被执行时或共享库第一次被调用时。共享库的另一个优点是库函数新版本发生变化,无需对使用该库的程序重新编辑连接。
《Unix环境系统高级编程》中的C语言内存分布示意图
text 正文段:cpu执行的机器指令部分,可以共享,只读
initialized data :初始化的数据, 数据段,包含程序中需要明确赋初值的变流。如c程序中出现在任何函数之外的声明 int maxcount=9,使此变量带有其初始值存放在初始化数据段中。
text和initialized由exec从程序文件中读入
uninitialized data:非初始化数据段,也称为bss段,在程序开始执行之前内核将此段中的程序初始化为0或空指针。如出现在任意函数外的c声明 long sum【1000】,此变量存放在非初始化数据段
堆:进行动态存储分配,位于非初始化化数据段和栈之间
栈:自动变量和每次函数调用时需要保存的信息放在此段中。每次调用函数时其返回地址以及调用者的环境信息都存放在栈中。
在unix中调用size命令可以查看正文段,数据段,bss段的长度
[weiwei@localhost process]$ size ./systemuse
text data bss dec hex filename
1513 272 8 1793 701 ./systemuse
dec:十进制表示的三个段的总长度
hex:16进制表示的三个段的总长度
堆与栈
a) 管理方式:栈由编译器管理,堆由程序员控制。
b) 空间大小:VC下栈默认是1MB,堆在32位的系统上可以达到4GB。
c) 碎片问题:栈不会产生碎片,堆会产生碎片。
d) 生长方向:堆向这内存地址增加的方向增长,栈向着内存地址减少的方向增长。
e) 分配效率:栈的分配效率非常高。堆的分配机制很复杂,效率比栈要低得多。
#include <stdlib.h> void *malloc(size_tsize); void *calloc(size_tnobj,size_tsize); void *realloc(void *ptr,size_tnewsize); //All three return: non-null pointer if OK,NULLon error void free(void *ptr);
1. malloc,which allocates a specified number of bytes of memory.The initial value of the memory is indeterminate. 分配指定字节数,初值不确定
void p = malloc(1024); /*配置1k的内存*/
2. calloc,which allocates space for a specified number of objects of a specifiedsize. The space is initialized to all 0 bits. 为指定数量的指定长度的对象分配存储空间,初始化为0
/* 动态配置10个struct test 空间 */ #include<stdlib.h> struct test { int a[10]; char b[20]; } main() { struct test *ptr=calloc(sizeof(struct test),10); }
3. realloc,which increases or decreases the size of a previously allocated area. When the size increases, it may involve moving the previously allocated area somewhereelse, to provide the additional room at the end. Also, when the size increases, the initial value of the space between the old contents and the end of the new area is indeterminate.