昨天帮人查bug,发现了一个vfork fork exit  _exit不分导致的问题。

使用vfork 后调用exit导致的问题。

主要需要弄清楚他们之间的区别:

1.  fork  ():子进程拷贝父进程的数据段,代码段
    vfork ( ):子进程与父进程共享数据段
2.  fork ()父子进程的执行次序不确定
    vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec
     或exit 之后父进程才可能被调度运行,return(n)组后也会调用exit(n);

  如果在 调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。子进程会继承父进程的信号,一般会在子进程设置重新设置信号cb。

3、

exit 和 exit

_exit 是操作系统为我们提供的系统调用,它的原型如下,status 参数定义了进程的终止状态

#include <unistd.h>
void _exit(int status);

exit 是 glibc 库中为我们封装好的库函数,它实际上也是调用了 _exit,但在调用 _exit 之前它还做了一些其他的事情

  1. 执行用户通过 atexit 定义的清理函数
  2. 关闭所有打开的流,冲刷缓冲区
  3. 调用 _exit
  1. exit()在结束调用它的进程之前,要进行如下步骤: 1.调用atexit()注册的函数(出口函数);按ATEXIT注册时相反的顺序调用所有由它注册的函数,这使得我们可以指定在程序终止时执行自己的清理动作.例如,保存程序状态信息于某个文件,解开对共享数据库上的锁等.
  2. 2.cleanup();关闭所有打开的流,这将导致写所有被缓冲的输出,删除用TMPFILE函数建立的所有临时文件.

  3. 3.最后调用_exit()函数终止进程。

  4. _exit做3件事(man): 1,Any open file descriptors belonging to the process are closed 2,any children of the process are inherited by process 1, init 3,the process's parent is sent a SIGCHLD signal

fork-vfork -exit&_exit的更多相关文章

  1. return, exit, _exit的区别

    return是返回的最常用的方式 _exit属于POSIX定义的系统调用 exit是GLIBC封装之后的函数 1 _exit和exit都会导致整个进程退出,清理进程所占用的资源,但是glibc封装ex ...

  2. fork,vfork和clone底层实现

    分类: LINUX2011-10-13 09:33 1116人阅读 评论(0) 收藏 举报 structdstsignalthreadnulldomain fork,vfork,clone都是linu ...

  3. return exit _exit

    (1)进程终止: C程序的终止分为两种:正常终止和异常终止. 正常终止分为: return, exit, _exit, _Exit, pthreade_exit. 异常中指分为: abort, SIG ...

  4. linux fork函数与vfork函数,exit,_exit区别

    man vfork: NAME vfork - create a child process and block parent SYNOPSIS #include <sys/types.h> ...

  5. fork &vfork --陈皓

    http://coolshell.cn/articles/7965.html http://coolshell.cn/articles/12103.html#more-12103 前两天有人问了个关于 ...

  6. Unix环境高级编程:fork, vfork, clone

    fork fork产生的子进程是传统意义上的进程,fork之后执行路径就互不关联了,一旦fork返回后面的代码就在不用的进程上下文中执行了.到底是子进程先执行还是父进程先执行一般是随机的或者依赖实现的 ...

  7. 进程控制fork vfork,父子进程,vfork保证子进程先运行

    主要函数: fork 用于创建一个新进程 exit 用于终止进程 exec 用于执行一个程序 wait 将父进程挂起,等待子进程结束 getpid 获取当前进程的进程ID nice 改变进程的优先级 ...

  8. 写时复制和fork,vfork,clone

    写时复制 原理: 用了“引用计数”,会有一个变量用于保存引用的数量.当第一个类构造时,string的构造函数会根据传入的参数从堆上分配内存,当有其它类需要这块内存时,这个计数为自动累加,当有类析构时, ...

  9. Fork & vfork & clone (转载)

    转自:http://blog.csdn.net/zqy2000zqy/archive/2006/09/04/1176924.aspx 进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合, ...

随机推荐

  1. JAVA对象头详解(含32位虚拟机与64位虚拟机)

    为什么要学习Java对象头 学习Java对象头主要是为了解synchronized底层原理,synchronized锁升级过程,Java并发编程等. JAVA对象头 由于Java面向对象的思想,在JV ...

  2. 多测师讲解html _表格标签007_高级讲师肖sir

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>表 ...

  3. 请求https接口时报错:Caused by SSLError(SSLError(1, u'[SSL: CERTIFICATE_VERIFY_FAILED] certificat,安装certifi

    如何解决SSL 根证书验错误: 一种解决方法是:verify=False 在session.request 里面: session.post(post_url,data=post_data,heade ...

  4. 【UR #13】Yist

    UOJ小清新题表 题目摘要 UOJ链接 给出一个排列 \(A\) 以及它的一个非空子序列 \(B\),给出一个 \(x\) 并进行若干次操作,每一次操作需要在 \(A\) 中选择一个长度恰好为 \(x ...

  5. 分布式协调服务之Zookeeper集群部署

    一.分布式系统概念 在聊Zookeeper之前,我们先来聊聊什么是分布式系统:所谓分布式系统就是一个系统的软件或硬件组件分布在网络中的不同计算机之上,彼此间通过消息传递进行通信和协作的系统:简单讲就是 ...

  6. springboot入门系列(二):SpringBoot整合Swagger

    上一篇<简单搭建SpringBoot项目>讲了简单的搭建SpringBoot 项目,而 SpringBoot 和 Swagger-ui 搭配在持续交付的前后端开发中意义重大,Swagger ...

  7. 网络爬虫养成记(第一天)——安装Scrapy

    古人云:工欲善其事,必先利其器.在网络爬虫中,Scrapy无疑是一把利器,那么,今天我们来谈谈Scrapy的安装. 幸运的是,Scrapy已经支持Python3.4+了,也就是说,我们可以在pytho ...

  8. python第一章:基础

    1.数学操作符: 数学操作符与数学基本类似 最高级:** 第二级:*././/.% 第三级:+ .- 遵循从左到右的顺序 如果想改变优先级 可以使用括号,比如:(3+2)*(5-4)=5*1=5 2. ...

  9. Ubuntu使用mail命令发送邮件

    sudo apt-get install mailutils   如下命令发送邮件:    mail -s "Test mail from ubuntu" ckboss@y< ...

  10. 【bug录】安装项目编译环境bug录

    安装mySQL是遇到一些问题: 刚开始按照教程配置int文件,看着图标没有显示正确,把隐藏文件夹后缀名去掉, mysql由两种版本,zip和msi格式,我用的是zip格式,mysql后进行解压,记住解 ...