本文主要是介绍vfork()函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Linux通过系统调用和fork()的功能相同,除了不拷贝父进程的页表项。子进程作为父进程的一个单独的线程在它的地址空间里运行,父进程被阻塞,直到子进程退出或执行exec()。子进程不能向地址空间写入。在过去的3BSD时期,这个优化是很有意义的,那时并未使用写时拷贝也来实现fork()。现在由于在执行fork()是引入了写时拷贝页表项了。如果Linux将来fork()有了写拷贝页表项,那么vfork()就彻底没用了。另外由于vfork语意非常微妙( 试想,如果exec()调用失败会发生什么?),所以最好让他逐渐淡出。完全可以把vfork()实现成一个普普通通的fork()-----实际上,Linux2.2以前都是这么做的。
vfork()系统调用的实现是通过向clone()系统调用传递一个特殊标志来进行的。
- 在调用copy_process()时,task_struct的vfork_done成员被设置为NULL。
- 在执行do_fork()时,如果给定特别标志,则vfork_done会指向一个特殊地址。
这篇关于vfork()函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!