联系:
fork()与vfock()都是创建一个进程
区别:
1、fork() : 子进程拷贝父进程的数据段,代码段。
vfork() : 子进程与父进程共享数据段。
2、fork() : 父子进程的执行次序不确定。
vfork() : 保证子进程先运行,在调用exec()或exit()或_exit()之前与父进程数据是共享的,在它调用exec或exit 之后父进程才可能被调度运行。
3、vfork() : 保证子进程先运行,在调用exec()或exit()或_exit()之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
对于vfork理解: 为什么会有vfork,因为以前的fork很傻,它创建一个子进程时,将会创建一个新的地址空间,并且拷贝父进程的资源,而往往在子进程中会执行exec调用,这样,前面的拷贝工作就是白费力气了,这种情况下,聪明的人就想出了vfork,它产生的子进程刚开始暂时与父进程共享地址空间(其实就是线程的概念了),因为这时候子进程在父进程的地址空间中运行,所以子进程不能进行写操作,并且在儿子霸占”着老子的房子时候,要委屈老子一下了,让老子在外面歇着(阻塞),一旦儿子执行了exec或者exit后,相当于儿子买了自己的房子了,这时候就相当于分家了。