fork与vfork的区别 (转)

上一篇 / 下一篇  2009-05-26 18:05:44 / 个人分类:C/C++

我的栏目
  • 栏目:C/C++

vfork用于创建一个新进程,而该新进程的目的是exec一个新进程,vforkfork一样都创建一个子进程,但是它并不将父进程的地址空间完全复制到子进程中,不会复制页表。因为子进程会立即调用exec,于是也就不会存放该地址空间。不过在子进程中调用execexit之前,他在父进程的空间中运行。

J#Y;Z&e#Q*~#{4]0

为什么会有vfork,因为以前的fork当它创建一个子进程时,将会创建一个新的地址空间,并且拷贝父进程的资源,而往往在子进程中会执行exec调用,这样,前面的拷贝工作就是白费力气了,这种情况下,聪明的人就想出了vfork,它产生的子进程刚开始暂时与父进程共享地址空间(其实就是线程的概念了),因为这时候子进程在父进程的地址空间中运行,所以子进程不能进行写操作,并且在儿子霸占着老子的房子时候,要委屈老子一下了,让他在外面歇着(阻塞),一旦儿子执行了exec或者exit后,相当于儿子买了自己的房子了,这时候就相当于分家了。

hn {v7|(]5E%z3m n0

vforkfork之间的另一个区别是:vfork保证子进程先运行,在她调用execexit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

,S hO6N,Lo&|/P0

由此可见,这个系统调用是用来启动一个新的应用程序。其次,子进程在vfork()返回后直接运行在父进程的栈空间,并使用父进程的内存和数据。这意味着子进程可能破坏父进程的数据结构或栈,造成失败。

pu0|Db8Z*V l0

为了避免这些问题,需要确保一旦调用vfork(),子进程就不从当前的栈框架中返回,并且如果子进程改变了父进程的数据结构就不能调用exit函数。子进程还必须避免改变全局数据结构或全局变量中的任何信息,因为这些改变都有可能使父进程不能继续。51Testing软件测试网Io-b]Z\

通常,如果应用程序不是在fork()之后立即调用exec(),就有必要在fork()被替换成vfork()之前做仔细的检查。

9XRD!a/i3i{0

fork函数创建子进程后,子进程往往要调用一种exec函数以执行另一个程序,当进程调用一种exec函数时,该进程完全由新程序代换,而新程序则从其main函数开始执行,因为调用exec并不创建新进程,所以前后的进程id并未改变,exec只是用另一个新程序替换了当前进程的正文,数据,堆和栈段。

?0b"CAY3V9x9s0

总之:

5]c_#h7R(M5j0

差别:51Testing软件测试网z_;}0c"Z0P

^{2eaH+] `*e0

1、fork()用于创建一个新进程。由fork()创建的子进程是父进程的副本。即子进程获取父进程数据空间,堆和   栈的副本。父子进程之间不共享这些存储空间的部分。而vfork()创建的进程并不将父进程的地址空间完全复制到子进程中,因为子进程会即时调用exec(或exit)于是也就不会存放该地址空间。相反,在子进程调用exec或exit之前,他在父进程的空间进行。

TV F/h+X0

2、vfork()和fork()另一个差别就是:vfork确保子进程先运行,在他调用exec或exit之后父进程才可能被调度运行。
?@.\Wj!Z q9O.D0

}o-xx x*G0

3、   使用fork调用会为子进程复制父进程所拥有的资源(进程环境,内存 堆栈等)。而使用vfork新建的子教程则是和父进程共享所有的资源 ,在子进程中对数据的修改也就是对父进程数据的修改 这里一定要注意。
i,e Vt$MIX0   4   使用fork系统调用产生父子教程 在默认情况下不加与人为干预,父子教程的执行循序是由OS调度的(也就是说他们两个执行循序不确定);而对于vfork所生成的父子进程,父进程自由在子进程调用了_exit() 或这exe()后才会继续执行。不调用着两个函数则会出错。

*mhv r9R'jq0
  相同点:51Testing软件测试网R&k Fm4s)u)A|*l
1、两者被调用一次,不过返回两次。两次返回的唯一差别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。


\Q6Hi {!iX051Testing软件测试网'ea,nr l'?f3c
总结:从上面可以看处 使用Vfork可以避免资源的浪费 但是也带了资源共享所产生的问题。51Testing软件测试网*Xx:p9m1tO2]

Refer to:http://blog.chinaunix.net/u/17660/showart_1227044.html51Testing软件测试网5o YnD%T7N0?

http://www.sudu.cn/info/html/edu/20080102/282571.html

0Wg'Nk4J%q:Mt$Ru#z0

http://hi.baidu.com/sofen/blog/item/9b813831b94d6f1debc4af04.html

5TMG-w v$l%}@0

 51Testing软件测试网*_RQ f ?3D0g


TAG: Linux linux fork

 

评分:0

我来说两句

日历

« 2024-03-20  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 231490
  • 日志数: 135
  • 图片数: 4
  • 文件数: 1
  • 书签数: 1
  • 建立时间: 2006-12-11
  • 更新时间: 2022-10-31

RSS订阅

Open Toolbar