1. 函数atexit。
int atexit(void (*func(void))); //若成功,返回0;若出错,返回非0
exit调用这些函数的顺序与它们登记时候的顺序相反,同一函数登记多次,也会调用多次。
#include "apue.h"
static void my_exit1(void);
static void my_exit2(void);
int main(void)
{
if(atexit(my_exit2) != 0)
err_sys("can't register my_exit2");
if(atexit(my_exit1) != 0)
err_sys("can't register my_exit1");
if(atexit(my_exit1) != 0)
err_sys("can't register my_exit1");
printf("main is done\n");
return 0;
}
static void my_exit1(void)
{
printf("first exit handler\n");
}
static void my_exit2(void)
{
printf("second exit handler\n");
}
/************************
main is done
first exit handler
first exit handler
second exit handler
***********************/
2. 环境表
extern char **environ;
3. C程序的存储空间布局
i. 正文段
ii. 初始化数据段
iii. 未初始化数据段
iX. 栈。 自动变量以及每次函数调用时所需保存的信息都存放在此段中
X. 堆。 在堆中进行动态存储分配
未初始化数据段的内容并不存放在磁盘程序文件中,因为内核在程序开始前将它们都置为0,需要放在磁盘程序文件中的段只有正文段和初始化数据段。
4. 共享库
gcc -static hello.c //阻止使用共享库
gcc hello.c //默认使用共享库
5. 存储空间分配
i. malloc,分配制定字节数的存储区。此存储区中的初始值不确定。
void *malloc(size_t size);
ii. calloc,为指定数量指定长度的对象分配存储空间。该空间中的每一位都初始化为0
void *calloc(size_t nobj, size_t size);
iii. realloc,增加或者减少以前分配区的长度。当增加长度时,可能需要将以前分配区的内容移动到一个更大的地方,新增区域内初始值不确定。
void *realloc(void *ptr, size_t newsize); //newsize是新存储区的长度,不是新存储区与旧存储区的长度差
6. 环境变量
char *getenv(const char *name); //返回跟name关联的value指针;若未找到,返回NULL
设置环境变量值
int putenv(char *str); //取形式为name=value的字符串,将其放到环境表中,若name已经存在,则先删除原来定义
int setenv(const char* name, const char* value, int rewrite); //将name设置为value,如果里面有name,当rewrite为非0,就将name先删除,然后再来定义;当rewrite为0,就不设置为新的value
int unsetenv(const char* name); //删除name的定义
修改name的处理(P170)
7. setjmp 和 longjmp函数(???)
#include "apue.h"
#include <setjmp.h>
#define TOK_ADD 5
jmp_buf jmpbuffer;
void do_line(char *);
void cmd_add(void);
int get_token(void);
int main(void)
{
char line[MAXLINE];
if(setjmp(jmpbuffer) != 0)
printf("error");
while(fgets(line, MAXLINE, stdin) != NULL)
do_line(line);
exit(0);
}
char *tok_ptr;
void do_line(char *ptr)
{
int cmd;
tok_ptr = ptr;
while((cmd = get_token()) > 0){
switch(cmd){
case TOK_ADD:
cmd_add();
break;
}
}
}
void cmd_add(void)
{
int token;
token = get_token();
if(token < 0)
longjmp(jmpbuffer, 1);
}
int get_token(void)
{
}
自动变量,寄存器变量,易失变量...
8. getrlimit 和 setrlimit函数,得到和设置资源限制。