业界的各位同行都知道,fork函数和vfork函数都是进行创建一个进程的。但是呢,各位知道它们之间有什么区别吗?接下来就让我给大家阐述一下:
我总结了一下几个区别:
- fork()创建的子进程拷贝了父进程的代码段,数据段,堆栈;而vfork()创建出来的子进程和父进程共享数据段;
- fork()创建的子进程执行次数不确定,操作系统对他们进行交替执行,而vfork()创建出来的必须要保证子进程先执行,子进程在调用exit()或exec()函数之前和父进程共享数据段和代码段,相当于线程的概念,父进程阻塞等待,子进程在它调用exit()或exec()函数之后父进程才可能被调度执行。
那我们就会问已经有了fork了,为什么还要有个vfork呢?
原因:以前的fork当它创建一个子进程时,将会创建一个新的地址空间,并且拷贝父进程的资源,然后将会有以下这两种行为:
1.执行从父进程那里拷贝过来的代码段;
2.调用一个exec()执行一个新的代码段;
当一个子进程调用了exec()之后,然后一个全新的子进程替换了当前的代码段,数据段,堆栈。去执行他想要执行的功能,这样的话,对于fork而言,之前的拷贝工作都白费了,于是呢人们就提出了vfork(),vfork并不会拷贝父进程的进程环境,它和父进程共享运行地址空间,所以子进程不可以进行写操作,并且当儿子“霸占”着老子的房子时候,要委屈老子一下了,让他在外面歇着(阻塞),一旦儿子执行了exec或者exi