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