7.2 注册atexit函数
看代码:
#include <stdio.h>
#include <stdlib.h>
static void exit1(){
printf("%s\n", __FUNCTION__);
}
static void exit2(){
printf("%s\n", __FUNCTION__);
}
int main(){
if (atexit(exit1) != 0 || atexit(exit2) != 0){
printf("register exit faield\n");
exit(1);
}
printf("%s is done\n", __FUNCTION__);
}
输出:
allen@allenPC:~/code/apuecode$ ./a.out
main is done
exit2
exit1
7.5环境表
每个程序都会收到一张环境表.getenv可获取:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int arg, char** argc){
if (arg < 2){
printf("usage env\n");
exit(1);
}
for (int i = 1; i < arg; ++i){
char* res = getenv(argc[i]);
if (NULL != res){
printf("get %s env is %s\n", argc[i], res);
}
}
exit(0);
}
比如:
allen@allenPC:~/code/apuecode$ ./a.out OS TERM HOME
get TERM env is xterm
get HOME env is /home/allen
7.6 C程序的存储空间布局
程序的逻辑布局:
1)正文段: CPU执行的机器指令部分. 可共享.
2)初始化数据段:包含了程序中需要明确赋初值.
3)非初始化数据段.在程序执行之前,内核将此段中的数据初始化为0或者null. 出现在任何函数外的c声明:long sum[1000]
4)栈
5)堆
需要放在程序中的段:正文段和初始化数据段
7.7共享库
7.8内存分配
free释放的空间通常被送入可用内存池.
malloc分配的空间比要求的要大.额外的空间用来记录管理信息-分配块的长度,指向下一个可分配块的指针..
7.10 setjmp longjmp
c中goto是不能跨越函数.而上面提到的两个能.对于处理发生在深层嵌套函数里处理出错是非常有用的.