第七章 进程环境

来源:互联网 发布:windows地图可以卸载吗 编辑:程序博客网 时间:2024/05/16 13:00

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 donefirst exit handlerfirst exit handlersecond 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 5jmp_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函数,得到和设置资源限制。


0 0