Unix环境高级编程学习笔记---The Environment of a Unix Process

发表于:2007-05-26来源:作者:点击数: 标签:
在学习进程控制之前,先了解一下单个进程的环境. 本章包括如下内容: 进程基本情况; 参数传递过程; 程序的内存分配及布局; 环境变量; 1.进程中止的五种方法: 正常中止: 从main返回, 调用exit和调用_exit 非正常中止:调用abort 以及被信号(signal)中止 exit
在学习进程控制之前,先了解一下单个进程的环境.
本章包括如下内容:
进程基本情况;
参数传递过程;
程序的内存分配及布局;
环境变量;

1.进程中止的五种方法:
    正常中止: 从main返回,  调用exit和调用_exit
    非正常中止:调用abort 以及被信号(signal)中止

exit与_exit的区别主要在,前者在退出程序前将关闭该进程所有打开的文件流等清理工作,然后返回内核,而后者则直接返回内核,不作任何清理工作.
另外还有一个atexit函数,可以注册一个函数在程序退出之前执行.
#include
int atexit(void (*func)(void));   //正确注册返回0,否则返回非零值.
一个程序可以多次利用atexit注册多个函数,调用顺序则是注册顺序的逆续.

2.环境列表
程序在执行之前,shell将向程序进程传递参数列表以及环境列表(environment list)
环境列表是由字符指针组成的数组,这个数组的地址保存在一个全局环境变量中extern char **environ



3.C程序的内存布局
C程序包含五个内存部分
    Text segment:存放机器指令,该部分一般是多个程序共享,并且为只读
    Initialized data segment: 存放被初始化的数据,如局部变量 int a = 1;
    Uninitialzed data segment : 存放未被初始化数据,如数组 char buffer[100];
    Stack: Automatic变量存放在堆栈中
    Heap: 动态内存分配在Heap中.



4.内存分配
在Ansi C中规定了三个内存分配函数:malloc, calloc, realloc (均在Heap中分配内存)
#include
void*malloc(size_t size);   //分配大小为size个字节的空间
void *calloc(size_t nobj, size_t size);   //为指定个数的对象分配内存,每个对象大小为size字节,共分配nobj*size个字节
void *realloc(void *ptr,size_t newsize); //重新分配Ptr所指内存块的大小,newsize为调整后的空间大小

原文转自:http://www.ltesting.net