Chinaunix首页 | 论坛 | 博客
  • 博客访问: 656518
  • 博文数量: 516
  • 博客积分: 4119
  • 博客等级: 上校
  • 技术积分: 4288
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-30 17:29
文章分类

全部博文(516)

文章存档

2014年(4)

2013年(160)

2012年(352)

分类:

2012-11-01 11:20:32

原文地址:程序的启动和退出 作者:graylocus

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个这样的终止处理函数。方法:

点击(此处)折叠或打开

  1. #include <stdlib.h>
  2. int atexit(void (*func)(void))
  3. 参数:func,用户自定义的处理函数指针
  4. 注意:该函数无参数,这类函数是在进程终止时调用的,因此也不用返回任何值。
  5.       进程终止处理函数的调用顺序 与 设置顺序相反。

阅读(157) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~