APUE2e之Exercise 8.2

17 篇文章 0 订阅
11 篇文章 0 订阅

vfork v.s. fork


/*
 * exercise8-2.c
 *
 *  Created on: Nov 10, 2011
 *      Author: zhuhuang
 */
 
#include <apueerr.h>
 
int glob = 6;
 
int callvfork(void)
{
	int var=88;
	pid_t pid;
 
	//compare the running results using vfork and fork
 
	/* Using fork
	in main first:4656
	before callvfork
	in callvfork parent:4656
	glob: 6, var: 88
	in main second:4656
	after callvfork
	before anothercall
	in anothercall:4656
	after anothercall
	in callvfork child:4661
	in main second:4661
	after callvfork
	before anothercall
	in anothercall:4661
	after anothercall
	*/
 
	/* Using vfork
	in main first:4608
	before callvfork
	in callvfork child:4613
	in main second:4613
	after callvfork
	before anothercall
	in anothercall:4613
	after anothercall
	in callvfork parent:4608
	glob: 7, var: 2077184
	*/
 
	if((pid = fork()) < 0){
		err_sys("vfork error");
	}else if(pid == 0){
		//the increasing of the variables done by the child changes the values in the parent
		glob++;
		printf("in callvfork child:%dn", getpid());
		return 0;
	}
 
	printf("in callvfork parent:%dn", getpid());
	printf("glob: %d, var: %dn", glob, var);  //var is
}
 
int anothercall(void)
{
	int i;
	int buf[100];
 
	for(i=0;i<100;i++)
		buf[i]=1;
 
	printf("in anothercall:%dn", getpid());
}
 
int main(void)
{
	printf("in main first:%dn", getpid());
 
	printf("before callvforkn");
	callvfork();
 
	//Using vfork: child process continues to execute the following code. But parent process doesn't.
	//Using fork: both child and parent processes execute the following code.
	printf("in main second:%dn", getpid());
 
	printf("after callvforkn");
	printf("before anothercalln");
	anothercall();
	printf("after anothercalln");
 
	exit(0);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值