Linux学习之创建子进程fork和vfork

int main()
{
	int pid;
	int data=0;
	
	pid = fork;				//用fork创建子进程的话,创建子进程的时候会给子进程划分自己的存储空间,拷贝父进程的一切代码和数据,所以下面代码运行的效果就是,父进程的data和子进程的data是分别两个互不相干的值。
	//另外,用fork创建子进程的话,子进程和 父进程的执行顺序时不确定的,是由系统的进程调度来安排的。
	
	pid = vfork;			//用vfork创建子进程的话,创建子进程的时候不会给子进程另外划分空间,不拷贝任何东西,直接只用父进程的存储空间,所以下面代码的运行效果就是,父进程的data和子进程的data是用一个data,在子进程中修改data时也就是在修改父进程的data,是同一个,所以父进程的data也会变。
	//另外,用vfork创建子进程的话,程序会保证子程序先执行,等子程序结束以后,才执行父进程。
	
	wait(NULL);			//这里的wait();很重要,如果没有了wait,在子进程结束以后,还会在ps——进程查看窗口中看到子进程存在,而且会变成僵尸进程——“Z+” ,另外需要提醒的是,变成僵尸进程跟进程结束的方式没有关系,而只看有没有wait,没有wait就会变成僵尸进程
	if(pid > 0)
	{
		while(1)
		{
			printf("this is father pid:%d,data=%d\n",getpid(),data);
			sleep(3);
		}
	}
	else if(pid == 0)
	{
		while(1)
		{
			data+=10;
			printf(:this is child pid:%d,data=%d\n:,getpid(),data);
			sleep(3);
			exit(0);				//正确的子进程退出应该用这个
			return 0;			//如果这里使用return结束子进程的话,那么父进程的data值将会错乱。
		}
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值