返回信息流求教大牛, 最近在看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环境编程中提到的死锁是怎么回事,谢谢啦
这是一条镜像帖。来源:北邮人论坛 / cpp / #39712同步于 2010/5/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【求助】 关于vfork 以及 exi、return
f2378
2010/5/28镜像同步9 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
转的
“为什么会有vfork,因为以前的fork很傻,当它创建一个子进程时,将会创建一个新的地址空间,并且拷贝父进程的资源,而往往在子进程中会执行exec调用,这样,前面的拷贝工作就是白费力气了,这种情况下,聪明的人就想出了vfork,它产生的子进程刚开始暂时与父进程共享地址空间(其实就是线程的概念了),因为这时候子进程在父进程的地址空间中运行,所以子进程不能进行写操作,并且在儿子“ 霸占”着老子的房子时候,要委屈老子一下了,让他在外面歇着(阻塞),一旦儿子执行了exec或者exit后,相当于儿子买了自己的房子了,这时候就相当于分家了。”
【 在 f2378 的大作中提到: 】
: 谢谢nickluchen,不过我想知道死锁是怎么产生的……
死锁的生成条件有好多个 你可以去看下操作系统的书
比较典型的一个情况是:
A等待B B又在等待A 互相等待又互相不释放 于是死锁产生了
vfork和fork之间的另一个区别是: vfork保证子进程先运行,在它调用exec或exit之后
父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作
,则会导致死锁。
vfork现在基本上废弃了,因为在效率上fork和vfork已经没有区别了,因为fork也是copy-on-write,而且vfork还有潜在的deadlock问题。如果想控制父子进程的执行顺序应该自己用signal或者mutex之类的同步手段