昨天帮人查bug,发现了一个vfork fork exit _exit不分导致的问题。
使用vfork 后调用exit导致的问题。
主要需要弄清楚他们之间的区别:
1. fork ():子进程拷贝父进程的数据段,代码段
vfork ( ):子进程与父进程共享数据段
2. fork ()父子进程的执行次序不确定
vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec
或exit 之后父进程才可能被调度运行,return(n)组后也会调用exit(n);
如果在 调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。子进程会继承父进程的信号,一般会在子进程设置重新设置信号cb。
3、
_exit 是操作系统为我们提供的系统调用,它的原型如下,status 参数定义了进程的终止状态
#include <unistd.h>
void _exit(int status);
exit 是 glibc 库中为我们封装好的库函数,它实际上也是调用了 _exit,但在调用 _exit 之前它还做了一些其他的事情
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。
原文:https://www.cnblogs.com/codestack/p/12595360.html