1.在shell环境下启动一个进程
linux shell可以运行两类文件:二进制可执行文件+解释器文件(如shell脚本)。
启动命令:./程序名 命令行参数
2.加载一个程序
(1)几个概念:
程序格式:elf格式,bin格式,不同的文件格式,文件内部的组织形式也不同,即内部结构不同。
内部结构:程序二进制代码段的数目和顺序就是程序内部的存储结构。
程序头:一个程序的二进制代码需要一个独立的单元记录一些统计信息。程序二进制代码内各个段的大小,段的次序,段的一些性质等是程序头中重要的记录。操作系统在加载程序时,会根据程序头提供的信息,分配给程序运行所需内存。
(2)程序加载的过程
1.从目标文件中读取足够的头部信息,计算出需要多大的地址空间。
2.分配地址空间,如果目标代码的格式具有独立的段,就将地址空间按独立的段划分
3.将程序读入地址空间的段内存中
4.将程序末尾的bss段全部写为0,如果虚拟内存系统不这么做时(不解后面这句话?)
5.如果体系结构需要,就创建一个堆栈段(stack segment)
6.设置程序参数和环境变量的其他运行时信息
7.开始运行程序,从main函数的地址处开始顺序执行程序
3.退出程序
在linux环境下,一个进程退出有3种方式:进程自动退出 + 进程收到一个信号退出 + 进程执行导致异常由系统控制其退出。
(1)自动退出:return + exit()
退出流程:调用return语句(或exit()函数)--->关闭打开的文件并将文件内容回写到外存上--->释放进程的地址空间+占用的文件锁---->进入内核将进程的结束状态报告给系统并且注销进程
进程的资源分为两类:一类资源在程序结束时释放+另一类资源由系统保存,用于以后对进程的统计
前者供进程本身使用,后者往往是提供给父进程。
(2)收到信号退出:父进程向子进程发送一个终止信号。子进程在收到信号后,会自动释放分配给它的资源,正常退出,过程如自动退出。
(3)异常退出:如segment fault
4.进程终止处理函数
linux系统允许在进程退出时调用一些用户自定义的函数,这些函数称为终止处理函数。linux规定,最多可设置32个这样的终止处理函数。方法:
- #include <stdlib.h>
- int atexit(void (*func)(void))
- 参数:func,用户自定义的处理函数指针
- 注意:该函数无参数,这类函数是在进程终止时调用的,因此也不用返回任何值。
- 进程终止处理函数的调用顺序 与 设置顺序相反。
阅读(2384) | 评论(0) | 转发(1) |