【APUE】进程环境



  • 进程终止
正常终止方式
1)从main返回
2)调用exit
3)调用_exit和_Exit
4)最后一个线程从其启动例程返回
5)最后一个线程调用pthread_exit
异常终止
6)调用abort
7)接到一个信号并终止
8)最后一个线程对取消请求作出响应
 
 
登记终止处理程序
int atexit(void (*func)(void));
调用func时无需向他传递任何函数,也不期望他返回一个值
 
 
exit退出程序时会调用登记的函数
终止程序每登记一次就会被调用一次,调用顺序和登记顺序相反。同一函数若登记多次就会被调用多次。
 
#include"apue.h"

void my_exit(void)
{
    printf("my exit 1\n");
}

void my_exit2(void)
{
    printf("my exit 2\n");
}

int main(void)
{
    atexit(my_exit);
    atexit(my_exit2);
    atexit(my_exit);
    printf("exit main function\n");
    return 0;
}

 

 
 
 
 
  • 环境表
每个程序都会有一张环境表
也是字符指针数组,其中每个指针包含一个以null结束的c字符串地址。全局变量environ则包含了该指针数组的地址
extern char **environ;
环境字符串的名字通常都如name=value
char *getenv(const char *name);获取环境变量
 
int putenv(char *str);
int setenv(const char *name, const char *value, int rewrite);设置环境变量
 
int unsetenv(const char *name); 删除环境变量
 
 
 
  • c程序的存储空间布局
1)正文段。cpu执行的机器指令部分,通常,正文段是可共享的,只读的。
2)初始化数据段。包含了程序中需要明确赋初值的变量。比如出现在任何函数段外的声明
int maxmount = 100;
3)非初始化数据段。也称为bss段,程序开始前,内核将此段中的数据初始化为0或者空指针。出现在任何函数外的c声明
long num[1000];
4)栈。自动变量和每次函数调用时所需保存的信息都存放在此段中。每次调用函数时,其返回地址及调用者的环境信息都存放在栈中。然后最近被调用的函数在栈上为其自动和临时变量分配存储空间。通过这种方式就可以实现递归。每次调用自身就会开辟一个新的栈,因此一个函数调用实例中的变量集不会影响到另一个函数调用实例中的变量。
5)堆。通常在堆中动态分配内存
 
 
 
 
动态分配空间
void *malloc(size_t size);
void *calloc(size_t nobj, size_t size);
void *realloc(void *ptr, size_t newsize);
 
 
void *free(void *ptr);
返回的指针一定是适当对齐的,可以使用于任何数据对象。
 
 
posted @ 2012-09-18 11:16  w0w0  阅读(196)  评论(0编辑  收藏  举报