vfrok()的使用

代码:

#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>

int g_val=0;

int main()
{
	 int val = 0;
	//  pid_t id = fork();
	 pid_t id = vfork();
	 //vfork创建的子进程是在父进程的空间上进行操作,如果不exit则会破坏父进程的
	 //栈空间,出现段错误或者死循环
	 if(id < 0)
	 { 
	   printf("error\n");
	   exit(0);
	 }
	 else if(id ==0)
	 {
	 	printf("child val:%d g_val:%d\n",val,g_val);
	 	sleep(1);
		++val;
		++g_val;

//我的机器上如果调用return 0,则会无限循环,而有的机器上会直接挂掉,遇到这两种情况不要迟疑,因为main函数的栈被破坏了,所以程序可能挂了,也
//可能无限循环。---》原因是return会释放栈,清理资源(想想C++中调用return后会调用析构函数),而exit不会(他不是系统调用)

	  //exit(0); //子进程必须调用exec或exit后父进程才可能被调度
	  //return 0;  
	 }
	 else
	 {
		g_val++;
	 	printf("father val:%d g_val:%d\n",val,g_val);
		sleep(1);
	 } 
	 //return 0;//发生死循环
	 _exit(1);
<span style="white-space:pre">	</span>//exit(1);//也是相同的结果
}

结果:



注意:

main函数中也是_exit(1),,否者会发生死循环


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值