fork与vfork的区别.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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

文档评论(0)

xxj1658888 + 关注
实名认证
文档贡献者

教师资格证持证人

该用户很懒,什么也没介绍

领域认证该用户于2024年04月12日上传了教师资格证

1亿VIP精品文档

相关文档