曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 9159|回复: 2
打印 上一主题 下一主题

[进程] 进程的退出

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2009-6-15 15:29:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
进程的退出表示进程即将结束运行。在 linux 系统中进程退出的方法分为正常退出和异常退出两种。其中正常退出的方法有 3种,异常退出的方法有 2种。

(1)正常退出
      在 main() 函数中执行 return 。
      调用 exit() 函数。
      调用 _exit() 函数。
(2)异常退出
      调用 abort() 函数。
      进程收到某个信号,而该信号使进程终止。

不管是哪种方式退出,最终都会执行内核中同一段代码。这段代码用来关闭进程所有已打开的文件描述符,释放它所占用的内存和其他资源。

以下是各种退出方式的比较:
      exit 和 return 的区别:exit 是一个函数,有参数;而 return 是函数执行完后的返回。exit 把控制权交给系统,而 return 将控制权交给调用函数。
      exit 和 abort 的区别:exit 是正常终止进程,而 abort 是异常终止。
      exit (int exit_code ) :exit 中的参数 exit_code 为 0 代表进程正常终止,若为其他值表示程序执行过程中有错误发生,比如溢出、除数为 0 。
      exit 和 _exit() 的区别:exit() 在头文件 stdlib.h 中声明,而 _exit() 声明在头文件 unistd() 中。两个函数均能正常终止进程,但是 _exit() 会执行后立即返回给内核,而 exit() 要先执行一些清除操作,然后将控制权交给内核。
父子进程终止的先后顺序不同会产生不同的结果。在子进程退出前父进程退出,则系统会让 init 进程接管子进程。当子进程先于父进程终止,而父进程又没有调用 wait() 函数等待子进程结束,子进程进入僵死状态,并且会一直保持下去除非系统重启。子进程处于僵死状态时,内核只保存该进程的一些必要信息以备父进程所需。此时子进程始终占用着资源,同时也减少了系统可以创建的最大进程数。如果子进程先于父进程终止,且父进程调用了 wait() 或 waitpid() 函数,则父进程会等待子进程结束。

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
沙发
 楼主| 发表于 2009-6-15 16:28:32 | 只看该作者

exit 和 _exit() 的区别

( 1 ) exit() 和 _exit() 函数说明

exit 和 _exit 函数都是用来终止进程的。当程序执行到 exit 或 _exit 时,进程会无条件地停止剩下的所有操作,清除包括 PCB 在内的各种数据结构,并终止本进程的运行。但是,这两个函数还是有区别的,这两个函数的调用过程如下图所示:
 

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
板凳
 楼主| 发表于 2009-6-15 17:47:40 | 只看该作者

exit 和 _exit() 的区别-2

由上图可看出,_exit() 函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核中的各种数据结构;exit() 函数则在这些基础上做一些包装,在执行退出之前加了若干道工序。

exit() 函数和 _exit() 函数的最大区别在于 exit() 函数在调用 exit 系统之前要检查文件的打开情况,把文件缓冲区的内容写回文件,就是图中的 ”清理 I/O 缓冲“ 一项。

由于在 linux 的标准函数库中,有一种被称作“缓冲 I/O(buferred I/O)操作“,其特征就是对应每一个打开的文件,在内存中都有一片缓冲区。每次读文件时,会连续读出若干条记录,这样在下次读取文件时就可以直接从内存的缓冲区中读取。同样,每次写文件的时候,也仅仅是写入内存的缓冲区,等满了一定的条件( 如达到一定数量或遇到特定字符等 ),再将缓冲区中的内容一次性写入文件。

这种技术大大增加了文件读写的速度,但也为编程带来了一点麻烦。比如有一些数据,认为已经写入文件,实际上因为没有满足特定条件,它们还只是保存在缓冲区内,这时使用 _exit() 函数直接将进程关闭,缓冲区中的数据就会丢失。因此,若想保证数据的完整性,就一定要使用 exit() 函数。

关于 exit() 和 _exit() 的具体比较见:http://www.groad.net/bbs/read.php?tid=859
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 15:50 , Processed in 0.078057 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表