《UNIX环境高级编程》七进程环境读书笔记

1、进程终止
有8种方式使进程终止,其中5种为正常终止:
(1)从main返回;
(2)调用exit;
(3)调用_exit或_Exit;
(4)最后一个线程从其启动例程返回;
(5)从最后一个线程调用pthread_exit;
异常终止有三种方式:
(6)调用abort
(7)接到一个信号
(8)最后一个线程对取消请求做出响应

#include 
void exit(int status);
void _Exit(int status);
#include 
void _exit(int status);

_exit和_Exit立即进入内核,exit则先执行一些清理处理,然后返回内核。
exit函数总是执行一个标准I/O库的清理关闭操作:对于所有打开流调用fclose函数(输出缓冲中的所有数据都被冲洗,即写到文件上)。
若main的返回类型是整型,并且main执行到最后一条语句返回,那么该进程的终止状态是0。

调用atexit函数来登记终止处理程序:

#include 
int atexit(void (*func)(void));
若成功,返回0;若出错,返回非0

注:exit调用这些函数的顺序与他们登记时候的顺序相反。同一函数如若登记多次,也会被调用多次。

3、环境表《UNIX环境高级编程》七进程环境读书笔记_第1张图片

4、C程序的存储空间布局
C程序由下列几部分组成:
(1)正文段:
(2)初始化数据段:包含了程序中需明确地赋初值的变量。
(3)未初始化数据段:在程序开始执行之前,内核将此段中的数据初始化为0或空指针。
(4)栈:保存自动变量以及每次函数调用时所需保存的信息。递归函数每次调用自身时,就用一个新的栈帧。
(5)堆:通常在堆中进行动态存储分配。《UNIX环境高级编程》七进程环境读书笔记_第2张图片

5、共享库
共享库是的可执行文件中不再需要包含公用的库函数,而只需在所有进程都可引用的存储区中保存这种库例程的一个副本。程序第一次执行或者第一次调用某个库函数时,用动态链接方法将程序与共享库函数相链接。

6、存储空间分配
3个用于存储空间动态分配的函数:
(1)malloc:分配指定字节数的存储区。此存储区中的初始值不确定。
(2)calloc:为指定数量指定长度的对象分配存储空间。该空间中的每一位都初始化为0.
(3)realloc:增加或减少以前分配区的长度。当增加长度时,可能需将以前分配区的内容移到一个足够大的区域。新增区域内的初始值不确定。

#include 
void *malloc(size_t size);
void *calloc(size_t nobj,size_t size);
void *realloc(void *ptr,size_t newsize);
若成功,返回非空指针;若出错,返回NULL
void free(void *ptr); //被释放的空间通常被送入可用存储区池。

注:如若一个进程调用malloc函数,但却忘记调用free函数,那么该进程占用的存储空间就会连续增加,这被称为泄漏。

7、环境变量
环境字符串:name=value

取环境变量值:

#include 
char *getenv(const char *name);
若成功,返回与name关联的value的指针,若未找到,返回NULL
#include 
int putenv(char *str);
若成功,返回0;若出错,返回非0int setenv(const char *name,const char *value,int rewrite);
int unsetenv(const char *name);
若成功,返回0;若出错,返回-1

putenv取形式为name=value的字符串,将其放到环境表中。如果name已经存在,则先删除其原来的定义。
setenv将name设置为value。如果在环境中name已经存在,那么若rewrite非0,则首先删除其现有的定义;若rewrite为0,则不删除其现有定义(name不设置为新的value)。
unsetenv删除name的定义。

8、函数setjmp和longjmp
非局部goto函数——setjmp和longjmp函数。非局部指的是,这不是由普通的C语言goto语句在一个函数内实施的跳转,而是在栈上跳过若干调用帧,返回到当前函数调用路径上的某一个函数中。

#include 
int setjmp(jmp_buf env);
若直接调用,返回0;若从longjmp返回,则为非0
void longjmp(jmp_buf env,int val);

注:通常将env变量定义为全局变量。
存放在存储器中的变量将具有longjmp时的值,而在CPU和浮点寄存器中的变量则恢复为调用setjmp时的值。

9、函数getrlimit和setrlimit

#include 
int getrlimit(int resource,struct rlimit *rlptr);
int setrlimit(int resource ,const struct rlimit *rlptr);
若成功,返回0;若出错,返回非0
struct rlimit{
rlim_t rlim_cur;//soft limit
rlim_t rlim_max;//hard limit
};

你可能感兴趣的:(UNIX环境高级编程)