Apue.2e Chapter7

本章学习进程环境,主要是一些编译器、系统与程序直接的结合等方面的知识。

常识部分略过,记录一些要点。

main中return语句实质上仍然调用exit函数。

使用atexit函数注册返回回调函数,其注册顺序与实际调用顺序相反。

环境变量相关:

全局变量environ可以直接读取环境变量表,函数getenv,setenv,putenv和unsetenv可以用来操作环境变量。

#include <stdlib.h>

char *getenv(const char *name);

int putenv(char *str);

int setenv(const char *name,const char *value, int rewrite);

int unsetenv(const char *name);

这些函数是进程相关的,不能改变父进程的环境变量。

虽然这些函数被定义到标准库中,但是实际上标准声明环境的内容是由实现定义的…

注意putenv的参数不能定义在栈中,而应该是静态数据。

一般环境表被定义在进程存储空间的栈顶部,修改环境变量会引起进程空间布局的变化。

如果修改后的字符串无需更大的空间,一切好说;如果需要,新字符串就会放在heap中(因为stack中无法扩展了)。

存储器分配:

这一部分和win下基本一致,包括.text, .data, .bss, heap, stack这几部分。

malloc系函数(一般通过sbrk系统调用实现)返回的指针是严格对齐的,但是多数情况下其分配的存储空间要比申请的大一些,多余的部分用于存放管理信息。因此超出末端的写操作会毁坏这些信息,造成严重破坏。

其他:alloca函数也可以用来申请空间,但是新的空间是在stack上分配的,无需自己free(但是不是所有系统都有这个函数);

异常处理:

C语言没有异常,可以使用setjmp和longjmp组成简单的异常处理机制(但不适用用大型程序架构),这一部分在CII一书中有较好的实现。

资源限制:

//SUS

#include <sys/resource.h>

int getrlimit(int resource, struct rlimit *rlpter);

int setrlimit(int resource, const struct rlimit *rlpter);

struct rlimit{

    rlim_t rlim_cur;        //软限制:当前限制

    rlim_t rlim_max;    //硬限制:最大限制

};

软限制必须小于等于硬限制,硬限制提高需要su权限。

资源限制会被所有子进程继承。

posted @ 2013-01-20 19:24  生无所息  阅读(173)  评论(0编辑  收藏  举报