#进程的运行环境总结
####开始运行
先说一下进程的运行环境,我们一个进程首先是从main函数开始运行的,有点像单片机的时候也是从main函数开始跑的
####进程终止
进程终止的5种形式 :
main函数返回
调用exit
调用_exit或者_Exit
最后一个线程返回
最后一个线程调用了pthread_exit
说起exit函数我们应该注意一个十分重要的知识点 那个知识点就是exit到底做了什么
根据unix网络编程的记载
exit执行后有两步操作 第一部是关闭所有的io描述符,第二步是释放内存 然后才结束进程,在unix 4.8节最后 的例子中,书中说过exit进程终止处理的部分工作就说关闭所有已经打开的描述符.
atexit可以用来注册终止处理程序,一个进程可以注册32个处理函数,exit函数是后注册先触发的队列顺序
####运行环境
每一个进程都有一张环境表,全局变量environ为环境指针,指针数组是环境表
环境指针 环境表
environ-----------》HOme,PATH,SHELL,USER,LOGNAME
####共享库
这个就要从makefile的静态库和动态库说起了,.a是静态库,他是直接跟程序编译在一起的,所以会导致二进制文件比较大.a文件,
如果是动态库那么就是.so文件,他不是直接静态编译进去的,是在程序进行调用的时候才会跟程序进行连接,所以他会导致程序运行慢一些,但是无疑会让程序变得小一些,而且替换库的时候不需要重新进行编译和连接
####c程序的存储空间布局
一个c的程序,我们要知道他从高地址到低地址依次是参数和环境变量----》堆栈区------》数据区(初始化的数据区和未初始化的数据区)------》正文段
#### 存储分配
4个函数要知道
malloc 动态在堆上分配一块连续内存
relloc 对malloc申请的内存进行重新的分配
alloc在栈上申请一块内存
calloc 在堆上动态申请一块内存并且将其初始化为0
####setjump和longjump
我们知道goto 的话只能在函数内使用无法超越函数这个范畴这时候我们可以引入setjump.h这个头文件使用setjump设置一个buffer,然后longjump,设置setjump的返回值进行跳转就可以了。