进程环境-C程序的启动和终止
360面试回来了,结果是好的,面上了。技术面让我在校多补补多进程和多线程,所以开始看Unix环境高级编程,所以这里的都是看书的一个大致总结,很多都是书上的内容。
一:main如何被调用
1.内核执行C程序
2.调用启动例程,从内核获取命令行参数和环境变量
3.调用main
其实main之前的操作时很复杂的,栈和BSS的初始化,库的初始化。之前看过一篇文章,有兴趣的可以百度,这里我们只要只要main之前有一个启动例程被调用,而且启动例程把命令行参数和环境变量传递给main函数并调用。
二:进程的终止
启动例程调用main后,那么自己什么时候结束呢?linux中提供三个函数,可以正常的终止一个进程。分别是void exit(int),void _exit(int),void _Exit(int)。第一个是库函数,后面两个是系统调用。每个带有一个参数,这个参数也称为终止状态。
exit(int)被调用后
1.调用每个终止处理函数
2.关闭所有打开的流
3.调用_exit(int)/_Exit()
终止处理函数:
调用exit结束一个进程时,首先去执行那个终止处理函数。我们可以通过void atexit(void (*func)(void))登记终止处理函数,终止函数的执行顺序与登记的顺序相反,如果一个函数多级登记,也会多次调用。
_exit(int)/_Exit(int)
清除进程使用的内存,销毁进程在内核中的数据结构。
最后,通过一个经典的图总结C程序如何启动,以及怎样终止