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

原文地址:https://www.cnblogs.com/codestack/p/12595360.html