BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #39712同步于 2010/5/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

【求助】 关于vfork 以及 exi、return

f2378
2010/5/28镜像同步9 回复
求教大牛, 最近在看unix环境编程,遇到这个程序,不理解。 #include <stdio.h> #include <stdlib.h> #include <unistd.h> main() { pid_t pid; int count = 0; pid = vfork(); count++; printf( "%d\n", count ); return ( 0 ) ; } 这样为什么一直交替输出1,2 而用exit(0)只输出一次1/2, unix环境编程中提到的死锁是怎么回事,谢谢啦
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
nickluchen机器人#1 · 2010/5/28
转的 “为什么会有vfork,因为以前的fork很傻,当它创建一个子进程时,将会创建一个新的地址空间,并且拷贝父进程的资源,而往往在子进程中会执行exec调用,这样,前面的拷贝工作就是白费力气了,这种情况下,聪明的人就想出了vfork,它产生的子进程刚开始暂时与父进程共享地址空间(其实就是线程的概念了),因为这时候子进程在父进程的地址空间中运行,所以子进程不能进行写操作,并且在儿子“ 霸占”着老子的房子时候,要委屈老子一下了,让他在外面歇着(阻塞),一旦儿子执行了exec或者exit后,相当于儿子买了自己的房子了,这时候就相当于分家了。”
f2378机器人#2 · 2010/5/28
谢谢nickluchen,不过我想知道死锁是怎么产生的……
jmpesp机器人#3 · 2010/5/28
【 在 f2378 的大作中提到: 】 : 谢谢nickluchen,不过我想知道死锁是怎么产生的…… 死锁的生成条件有好多个 你可以去看下操作系统的书 比较典型的一个情况是: A等待B B又在等待A 互相等待又互相不释放 于是死锁产生了
nickluchen机器人#4 · 2010/5/28
APUE上好像讲了,我查查啊 【 在 f2378 的大作中提到: 】 : 谢谢nickluchen,不过我想知道死锁是怎么产生的…… : --
nickluchen机器人#5 · 2010/5/28
vfork和fork之间的另一个区别是: vfork保证子进程先运行,在它调用exec或exit之后 父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作 ,则会导致死锁。
nickluchen机器人#6 · 2010/5/28
APUE上边有一个例程, 里边的子进程是用的_exit(0),如果用return,(实际应该也就是用exit),父进程的输出结果不确定
f2378机器人#7 · 2010/5/28
嗯,果然很神奇,一直以为exit和return是一样的,谢谢啦
jokerlee机器人#8 · 2010/5/28
vfork现在基本上废弃了,因为在效率上fork和vfork已经没有区别了,因为fork也是copy-on-write,而且vfork还有潜在的deadlock问题。如果想控制父子进程的执行顺序应该自己用signal或者mutex之类的同步手段
SandFlee机器人#9 · 2010/5/29
child shares all memory with its parent, including the stack ---man vfork