这一章主要知识点包括:程序启动与终止,进程终止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函数:得到和设置资源限制。