vfork到底有什么用?

doreyike 2008-12-30 10:02:47
看了vfork后,对它的用处非常费解。
Unix编程说vfork()和fork()的功能相同,除了不拷贝父进程的页表项,也就是说不会复制和父进程相关的资源,父子进程将共享地址空间,子进程对虚拟内存空间的任何实际修改实际上是在修改父进程虚拟内粗空间的内容。并且其父进程会被阻塞,直到子进程退出或者执行exec()函数族.这样由于父子进程共享地址空间,避免了fork在资源复制是的消耗。
这样说来vfork一调用就导致父进程阻塞,并且子进程的操作实际上也是对父进程空间的操作(应该可以这样理解吧),这样完全无法实现多进程,vfork有什么存在的必要。我有什么功能还必须得vfork让子进程做,还不如父进程自己直接做了呢。反正是要阻塞的。
谁帮我解释下,极度不解!
...全文
310 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
老友小明哥 2012-10-27
  • 打赏
  • 举报
回复 1
[Quote=引用 5 楼 的回复:]

引用楼主 doreyike 的帖子:
看了vfork后,对它的用处非常费解。
Unix编程说vfork()和fork()的功能相同,除了不拷贝父进程的页表项,也就是说不会复制和父进程相关的资源,父子进程将共享地址空间,子进程对虚拟内存空间的任何实际修改实际上是在修改父进程虚拟内粗空间的内容。并且其父进程会被阻塞,直到子进程退出或者执行exec()函数族.这样由于父子进程共享地址空间,避免了f……
[/Quote]
为什么我测试却不等于1
kestre1 2008-12-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 zmlovelx 的回复:]
摘一段:
在原来的UNIX中,fork()创建一个新的进程,它会复制父进程的空间。而在实际应用中,通常调用fork()后,子进程会调用exec()执行新的程序,这样fork()复制父进程空间就有些浪费,因此有vfork()调用,不进行复制,而是copy-on-write。
但现代的操作系统大多缺省使用copy-on-write,vfork()即和fork()一样了
[/Quote]
UP!
就呆在云上 2008-12-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 doreyike 的帖子:]
看了vfork后,对它的用处非常费解。
Unix编程说vfork()和fork()的功能相同,除了不拷贝父进程的页表项,也就是说不会复制和父进程相关的资源,父子进程将共享地址空间,子进程对虚拟内存空间的任何实际修改实际上是在修改父进程虚拟内粗空间的内容。并且其父进程会被阻塞,直到子进程退出或者执行exec()函数族.这样由于父子进程共享地址空间,避免了fork在资源复制是的消耗。
这样说来vfork一调用就导致父进程阻塞,并且子进…
[/Quote]

unix环境高级编程里面说的非常清楚了
不是一般的清楚

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


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


代码:

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
int flag = 0;
int chld;
if (!(chld = fork()))
{
flag = 1;
exit();
}
wait(chld);
printf("flag = %d\n", flag);
return 0;
}

输出:flag = 0
把fork改成vfork后,输出为:flag = 1
帅得不敢出门 2008-12-30
  • 打赏
  • 举报
回复
摘一段:
在原来的UNIX中,fork()创建一个新的进程,它会复制父进程的空间。而在实际应用中,通常调用fork()后,子进程会调用exec()执行新的程序,这样fork()复制父进程空间就有些浪费,因此有vfork()调用,不进行复制,而是copy-on-write。
但现代的操作系统大多缺省使用copy-on-write,vfork()即和fork()一样了
fidewaway 2008-12-30
  • 打赏
  • 举报
回复
mark
  • 打赏
  • 举报
回复
不过使用vfork有个问题要注意, vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
  • 打赏
  • 举报
回复
你要知道一个前提,vfork的出现是因为很多时候人们调用完fork后,子进程又调用exec.这样,前面的拷贝工作就是白费力气了,这种情况下,聪明的人就想出了vfork,它产生的子进程刚开始暂时与父进程共享地址空间(其实就是线程的概念了),因为这时候子进程在父进程的地址空间中运行,所以子进程不能进行写操作.
一旦儿子执行了exec或者exit后,相当于儿子买了自己的房子了,这时候就相当于分家了。
所以,你可以理解为vfork+exec基本等于fork。而一般来说vfork也就是和exec搭配的。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧