第七章 进程环境

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函数,得到和设置资源限制。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值