Chinaunix首页 | 论坛 | 博客
  • 博客访问: 90997
  • 博文数量: 17
  • 博客积分: 352
  • 博客等级: 一等列兵
  • 技术积分: 184
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-10 20:58
文章分类
文章存档

2014年(1)

2011年(16)

我的朋友

分类: LINUX

2011-09-05 16:33:31


Unix OS中,通过执行系统调用exit来终止一个进程。进程可以显示的调用exit系统调用来终止一个进程,也可以通过在程序结束时的return来实现startup routine调用exit当一个C程序从main函数返回时)。

调用exit方式如下:

        exit(status);

status是返回给父进程终止code。当一个进程exit后,这个进程处于zombie state

exit系统调用的执行发生以下事件:

1.清除当前进程的所有信号处理函数。

2.如果当前进程是和终端关联的“进程组组长”,则会向每个组内进程发送hang-up signal,并且把这些成员的进程组设置为0

3.通过内核内部算法关闭当前进程所有打开的文件描述符,并且释放当前目录所关联的inode;如果存在current (charged)root,也将其释放通过算法iput

4.为进程释放所有region以及关联的memory

5.计算进程机器子进程执行的时间user mode 和kernel mode),并把记录写到一个全局的accounting file

6.进程的状态改变为zombie,并将自己的所有的子进程的父进程ID设置为1init);如果有孩子的状态是zombie,向init进程发SIGCHLD信号,以清除子进程的process table slot

7.exiting进程向自己的父进程发送SIGCHLD信号。

8.进行context switch调度其他非zombie进程(本进程已经是zombie)。

 

在讨论exit与_exit之前,先来讨论文件内存缓存区的问题。

   在linux中,标准输入输出(I/O)函数都是作为文件来处理。对应于打开的每个文件,在内存中都有对应的缓存,每次读取文件时,会多读一些记录到缓存中,这样在下次读文件时,就在缓存中读取;同样,在写文件时也是写在文件对应的缓存中,并不是直接写入硬盘的文件中,等满足了一定条件(如达到一定数量,遇到换行符\n或文件结束标志EOF)才将数据真正的写入文件。这样做的好处就是加快了文件读写的速度!但这样也带来了一些问题:比如有一些数据,我们认为已经写入了文件,但实际上没有满足一定条件而任然驻留在内存的缓存中,这样,如果我们直接用_exit()函数直接终止进程,将导致数据丢失!!-

   也许细心地读者已经发现前面使用的是_exit而不是exit,如果改成exit,就不会有数据丢失的问题出现了,这就是我要说的它们之间的区别了!要解释这个问题,就要涉及它们的工作步骤了。-

   exit():在执行该函数时,进程会检查文件打开情况,清理I/O缓存,如果缓存中有数据,就会将它们写入相应的文件,这样就防止了文件数据的丢失!然后终止进程。-

   _exit():在执行该函数时,并不清理标准输入输出缓存,而是直接清除内存空间,当然也就把文件缓存中尚未写入文件的数据给销毁了。由此可见,使用exit()函数更加安全。-

   此外,对于它们两者的区别还有各自的头文件不同:exit()--stdlib.h   _exit()--unistd.h-

   最后提一下,一般情况下exit(0)表示正常退出,exit(1),exit(-1)为异常退出,0、1、-1是返回值,具体含义可以自定.

   exit好象在stdio.h里面,所以要有包含头文件  
  return是返回函数调用,如果返回的是main函数,则为退出程序  
  exit是在调用处强行退出程序,运行一次程序就结束  
  -------------------------------------------------------------------  
  return  是函数返回  
  而exit是退出
  
  -------------------------------------------------------------------  
  exit(1)表示异常退出.这个1是回给操作系统的不过在DOS好像不需要这个返回值  
  exit(0)表示正常退出  
  -------------------------------------------------------------------  
  无论写在那里,都是程序推出,dos和windows中没有什么不一样,最多是系统处理的不一样。  
  数字0,1,-1会被写入环境变量ERRORLEVEL,其它程序可以由此判断程序结束状态。  
  一般0为正常推出,其它数字为异常,其对应的错误可以自己指定。  
  -------------------------------------------------------------------  

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