zoukankan      html  css  js  c++  java
  • fork-vfork -exit&_exit

    昨天帮人查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

  • 相关阅读:
    如何在Linux下的C++文件使用GDB调试
    21天学通C++(C++程序的组成部分)
    嵌入式Linux应用程序开发
    项目部署的问题
    未解决
    报错
    随笔
    逆向工程出现的错误1
    jpa学习
    springmvc整合mybaits
  • 原文地址:https://www.cnblogs.com/codestack/p/12595360.html
Copyright © 2011-2022 走看看