此文转自网友,本人只做了将两篇文章合并。各个文章原始作者不详。拒绝盗版。

_exit终止调用进程,但不关闭文件,不清除输出缓存,也不调用出口函数。
exit函数将终止调用进程。在退出程序之前,所有文件关闭,缓冲输出内容将刷新定义,并调用所有已刷新的“出口函数”(由atexit定义)。
‘exit()’与‘_exit()’有不少区别在使用‘fork()’,特别是‘vfork()’时变得很突出。

‘exit()’与‘_exit()’的基本区别在于前一个调用实施与调用库里用户状态结构(user-mode constructs)有关的清除工作(clean-up),而且调用用户自定义的清除程序(译者注:自定义清除程序由atexit函数定义,可定义多次,并以倒序执行),相对应,后一个函数只为进程实施内核清除工作。

在由‘fork()’创建的子进程分支里,正常情况下使用‘exit()’是不正确的,这是因为使用它会导致标准输入输出(译者注:stdio: Standard Input Output)的缓冲区被清空两次,而且临时文件被出乎意料的删除(译者注:临时文件由tmpfile函数创建在系统临时目录下,文件名由系统随机生成)。在C++程序中情况会更糟,因为静态目标(static objects)的析构函数(destructors)可以被错误地执行。(还有一些特殊情况,比如守护程序,它们的*父进程*需要调用‘_exit()’而不是子进程;适用于绝大多数情况的基本规则是,‘exit()’在每一次进入‘main’函数后只调用一次。)

在由‘vfork()’创建的子进程分支里,‘exit()’的使用将更加危险,因为它将影响父进程的状态

exit()在结束调用它的进程之前,要进行如下步骤:
1.cleanup();
2.在atexit()注册的函数;
最后调用_exit()函数。。。

exit()在结束调用它的进程之前,要进行如下步骤:
1.cleanup();
2.在atexit()注册的函数;
最后调用_exit()函数。。。
 

在fork之后,子进程和父进程都会继续执行fork调用之后的指令。子进程是父进程的副本。它将获得父进程的数据 空间,堆和栈的副本,这些都是副本,父子进程并不共享这部分的内存。也就是说,子进程对父进程中的同名变量进行修改并不会影响其在父进程中的值。但是父子 进程又共享一些东西,简单说来就是程序的正文段。正文段存放着由cpu执行的机器指令,通常是read-only的。

由于在fork之后我们常常都是跟个exec在后面,所以为了提高效率,很多的实现并不完全复制数据段和堆、栈,而是采用写时复制,有点类似于某些cache与内存数据的同步方法。

另 一种提高效率的方法就是使用vfork,vfork最早起源于2.9BSD,它与fork的不同就在于它并不将父进程的地址空间完全复制到子进程中,因为 子进程会立即调用exec。vfork出来的子进程是在父进程的空间中运行的,它的存在就是为了exec调用,所以它不需要复制这些东西,因为复制了也没 有用。如果这时子进程修改了某个变量,这将影响到父进程。
vfork与fork的另一区别是:vfork保证子进程先运行,在它调用exec或exit后父进程才可能调度运行。而fork的父子进程运行顺序是不定的,它取决于内核的调度算法。

所以,fork的时候,程序代码被复用了——我指的程序代码就是由cpu执行的机器指令部分,这与有多少个进程在运行无关,即使是频繁执行的程序在存储器中也只需一个副本,而且它在执行期可能是read-only的。当然,如果你exec了,那就是另一码事了。
另外,父进程中的数据空间和堆、栈可能会产生副本,具体情况要看你使用的是vfork还是fork。fork会产生副本,而vfork则共享这部分内存。

exit和_exit,fock和vfock相关推荐

  1. Linux环境编程--linux中的perror、exit、_exit、wait 和 waitpid

    perror: #include<stdio.h>        #include<stdlib.h> 定义函数 void perror(const char *s);  pe ...

  2. exit()与_exit()的区别(转)

    http://blog.csdn.net/lwj103862095/article/details/8640037 从图中可以看出,_exit 函数的作用是:直接使进程停止运行,清除其使用的内存空间, ...

  3. linux中exit()和 _exit()说明

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

  4. linux中进程退出函数:exit()和_exit()的区别

    linux中进程退出函数:exit()和_exit()的区别 (1)_exit()执行后立即返回给内核,而exit()要先执行一些清除操作,然后将控制权交给内核. (2)调用_exit函数时,其会关闭 ...

  5. exit()和_exit()函数

    进程就好比人一样有其生命,我们通过fork()函数来创建一个进程,那么我们又是如何来中止进程呢. 进程退出 1.在Linux中任何让一个进程退出 进程退出表示进程即将结束.在Linux中进程退出分为了 ...

  6. exit()与_exit()的区别

    直接看图更明白: 从图中可以看出,_exit 函数的作用是:直接使进程停止运行,清除其使用的内存空间,并清除其在内核的各种数据结构:exit 函数则在这些基础上做了一些小动作,在执行退出之前还加了若干 ...

  7. exit()、_Exit() 和 _exit() 函数的区别和联系

    一.来源不同 1.头文件 #include <stdlib.h>void exit(int status); void _exit(int status); #incldue <un ...

  8. exit()与_exit()函数的区别

    注:exit()就是退出,传入的参数是程序退出时的状态码,0表示正常退出,其他表示非正常退出,一般都用-1或者1,标准C里有EXIT_SUCCESS和EXIT_FAILURE两个宏,用exit(EXI ...

  9. Linux中exit与_exit的区别

    在exit,_exit的区别 - exit()与_exit()函数的区别(Linux系统中)2012-03-20 15:19:53 分类: LINUX 注:exit()就是退出,传入的参数是程序退出时 ...

最新文章

  1. 上交三月月赛[SJTU] 1105 path
  2. MySQL bin-log 日志清理方式
  3. YOLOv5添加注意力机制 Pytorch
  4. mysql数据库删除一条数据后还想让新增数据从空缺id处开始
  5. 微软宣布12月15日关闭开源软件托管平台CodePlex
  6. 7-6 0-1背包 (20 分)(思路加详解+网格做法+动态规划)Come Baby !!!!!!!!!!!!!!
  7. webx学习(四)——ResourceLoadingService
  8. PSP(个体软件过程)
  9. RabbitMQ架构模型(一)
  10. python 刷票_Python刷票器的简单实现
  11. Oracle数据库中文排序问题记录
  12. 中国止血分析仪行业市场供需与战略研究报告
  13. 华为鸿蒙系统卡顿怎么解决,为什么手机卡顿成系统难题?华为推出的鸿蒙系统有望解决...
  14. 第二人生的源码分析(十九)人物组合显示
  15. 九宫格,二十五宫格,甚至八十一宫格 技巧
  16. 计算机运行快是取决什么,电脑速度快慢取决哪个硬件
  17. could't excute 请求的操作需要提升 win32 error 740
  18. 使用ITunes向苹果手机中导入mobi文件
  19. 栈(stack)C语言实现(有详细注释讲解)
  20. css抄页面,如何正确的抄网页

热门文章

  1. 安利一个在线画UML图的网址
  2. HDLbits 4位BCD计数器2
  3. Python语言练习
  4. 鸟哥linux+韩顺平linux视频教程学习小结
  5. Pycharm安装.ignore
  6. Sql server没有服务器名称怎么办
  7. Doxygen简介及使用说明
  8. 7:C语言之求分段函数的值
  9. mock 数据常用的工具网站
  10. 为了会做题而学习股票定价