apue第七章 进程环境 笔记

7.2 注册atexit函数

看代码:

#include 
#include 

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 
#include 
#include 

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是不能跨越函数.而上面提到的两个能.对于处理发生在深层嵌套函数里处理出错是非常有用的.



你可能感兴趣的:(unix环境高级编程)