首页 > 代码库 > UNIX环境高级编程第七章

UNIX环境高级编程第七章

这一章主要知识点包括:程序启动与终止,进程终止exit与_axit,atexit函数。存储空间布局,深层嵌套出错跳出函数,资源查询与更改函数等内容。

技术分享

1.首先从内核传递命令行参数和环境变量值给c启动例程,然后c启动例程调用main函数,main调用其他函数。终止时,

可以使用_exit()函数或者_Exit()函数,直接调用内核结束。也可以调用exit()函数,先进行清理处理。(调用各终止处

理程序,标准I/O清理程序),然后再进入内核。

2.exit函数先调用各终止处理程序,再调用标准I/O流清理关闭工作:为所有打开流调用fclose函数。这会使所有缓冲输出数据被冲洗。

3.未定义的终止状态:(1)调用exit类函数没带终止状态(2)main函数return没有返回值的(3)main函数没有声明返回类型为整型的。

4.【atexit函数】

登记由exit自动调用的终止处理程序的集合。atexit登记程序的顺序与exit执行调用的顺序相反。void atexit(void)

5.c语言的存储空间布局

正文段:cpu执行的机器指令部分。可共享不可修改只读的;

初始化数据段:程序中需明确地赋初值的变量。

非初始化数据段:bbs段,内核将此段中数据初始化为0或空指针。

栈:自动变量以及每次函数调用时所需保存的信息都存放在此段中。

堆:动态存储分配。

6.共享库:程序第一次执行或第一次调用某个库函数时,用动态链接方法将程序与共享库函数相链接。

7.存储器分配函数

(1)malloc(2)calloc。分配若干个每个大小固定的存储空间。

(3)void *realloc(void *ptr, size_t newsize);//newsize是新的和旧的总长度

更改以前分配区的长度。如果往高位有足够的新分配空间,就直接在当前位置增加新空间。没有的话,

将当前内容与新分配内容一同放置到一个其他位置,删除原位置内容。所以不应分配指向他的指针

8.setjmp 与 longjmp

这是一组一同出现使用的函数。

setjmp函数确定的是出错之后返回到的main函数中的位置,longjmp是若出错,则从该longjmp处返回到main函数中的setjmp处。二者关联确定是同一组的标志是setjmp的参数与longjmp的第一个参数,需要是同样值,longjmp的第二个参数则用来区分其与setjmp相对应的longjmp里的不同出错位置,所以需要设定为不同整数值进行区分。

如果需要返回setjmp保存原来的值,就需要在变量前加volatile属性,优化执行就可以实现其值不回滚。

(1)volatile:作为关键字,确保本条指令不会应该编译器优化而忽略,而是每次直接读值。进行优化以后,volatile从寄存器取值,而不是存储器。

9.getrlimit和setrlimit函数:得到和设置资源限制。      

 

UNIX环境高级编程第七章