- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
fork与vfork的区别
fork ()与vfock ()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别:
1. fork ):子进程拷贝父进程的数据段,代码段
vfork ):子进程与父进程共享数据段
2. fork ()父子进程的执行次序不确定
vfork 保证子进程先运行,在调用exec 或exit 之前与父进程数据是共享的,在它调用exec
或exit 之后父进程才可能被调度运行。
3. vfork 保证子进程先运行,在她调用exec 或exit 之后父进程才可能被调度运行。如果在
调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。
下面通过几个例子加以说明:
第一:子进程拷贝父进程的代码段的例子:
#include sys/types.h
#include unistd.h
#include stdio.h
int main()
{
pid_t pid;
pid=fork();
if(pid0)
printf(error in fork !);
else if(pid==0)
printf(I am the child process,ID is %d\n,getpid());
else
printf(I am the parent process,ID is %d\n,getpid());
}
运行结果:
[root@lwm liweimeng]# gcc fork 1.c -o fork 1
[root@lwm liweimeng]# ./fork 1
I am the child process,ID is 4238
I am the parent process,ID is 4237
为什么两条语 都会打印呢?这是因为fork )函数用于从已存在的进程中创建一个新的进
程,新的进程称为子进程,而原进程称为父进程,fork )的返回值有两个,子进程返回0,
父进程返回子进程的进程号,进程号都是非零的正整数,所以父进程返回的值一定大于零,
在pid=fork();语 之前只有父进程在运行,而在pid=fork();之后,父进程和新创建的子进程
都在运行,所以如果pid==0 ,那么肯定是子进程,若pid !=0 事实上肯定大于0 ),那么是
父进程在运行。而我们知道fork()函数子进程是拷贝父进程的代码段的,所以子进程中同样
有
if(pid0)
printf(error in fork !);
else if(pid==0)
printf(I am the child process,ID is %d\n,getpid());
else
printf(I am the parent process,ID is %d\n,getpid());
}
这么一段代码,所以上面这段代码会被父进程和子进程各执行一次,最终由于子进程的pid=
=0,而打印出第一句话,父进程的pid0 ,而打印出第二句话。于是得到了上面的运行结果。
再来看一个拷贝数据段的例子:
#include unistd.h
#include stdio.h
int main(void)
{
pid_t pid;
int count=0;
pid=fork();
count++;
printf(count= %d\n,count);
return 0;
}
大家觉着打印出的值应该是多少呢?是不是2 呢?先来看下运行结果吧
[root@lwm liweimeng]# gcc fork2.c -o fork2
[root@lwm liweimeng]# ./fork2
count= 1
count= 1
为什么不是2 呢?因为我们一次强调fork )函数子进程拷贝父进程的数据段代码段,所以
count++;
printf(count= %d\n,count);
return 0
将被父子进程各执行一次,但是子进程执行时使自己的数据段里面的(这个数据段是从父进
程那 copy 过来的一模一样)count+1 ,同样父进程执行时使自己的数据段里面的count+1
您可能关注的文档
最近下载
- 临床医学专业培养方案-延边大学医学院.DOC
- (蒙) 紫外分光测油仪校准规范.pdf VIP
- 丝蛋白创面敷料临床试验报告(主要结果) .pdf VIP
- (蒙) 血型试剂卡孵育器校准规范.pdf VIP
- (蒙) 热压罐校准规范.pdf VIP
- 六年级(上)数学晨读晚默综合每日一练.pdf VIP
- 人教版高中数学A版选必第3册《第八章 成对数据的统计分析》大单元整体教学设计.docx
- 2025医疗器械经营质量管理体系文件(全套)(可编辑!).docx VIP
- 非招标方式采购文件示范文本6.docx VIP
- 广东省茂名市高州市十二校联考2025-2026学年八年级上学期12月月考语文试题(含答案).pdf VIP
原创力文档


文档评论(0)