fork() 创建子进程(三):父子进程变量数据空间分析

动机

观察父进程创建子进程后,

数据段空间

全局变量:global

栈段空间

局部变量:local

堆空间

指针变量指向:ptrInt 等
各种空间的隔离情况。

示例

示例1:交替输出

未利用sleep()做简单同步控制,混乱交替输出。

代码示例

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

int global=0;

int main() {

    int local=0;
  
    int * ptrInt = NULL;
    ptrInt = (int *) malloc(sizeof(int)); 
    *ptrInt = 0;
  
    int * ptrIntParent = NULL;
    int * ptrIntChild = NULL;

    pid_t child;
  
    if ((child=fork()) == -1)   {
	// 创建失败
		printf("Fork Error.\n");
	
    }

    if (child == 0)  {
	// 子进程
	//sleep(1); // 请注释此行,看看执行效果差异。
	
		printf("******************* child before modify *********************\n");
		printf("Now it is in child process. I am %d.\n", getpid());
		printf("local is %d, global is %d,  prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
		printf("******************* child *********************\n");     

		local = local+2;
		global = global + 3;
		* ptrInt = * ptrInt + 4;
	
    	ptrIntChild = (int *) malloc(sizeof(int)); 
		* ptrIntChild = 5;
        
		printf("******************* child after modify *********************\n");
		printf("Now it is in child process. I am %d.\n", getpid());
		printf("local is %d, global is %d,  prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
		printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
		printf("ptrIntChild adress is %u, *prtIntChild is %d.\n",ptrIntChild,*ptrIntChild);	
		printf("******************* child *********************\n");     
	
		free (ptrInt);
	
    	free (ptrIntChild);
	
	//free (ptrIntParent);

		exit(0);
	
    }
    else  {
	 // 父进程
	//sleep(1); // 请注释此行,看看执行效果差异。
   

		printf("******************* parent before modify *******************\n");  
		printf("Now it is in parent process. I am %d.\n", getpid());      
		printf("local is %d, global is %d, prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
		printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
		printf("******************* parent *******************\n");      

		local = local + 20;
		global = global + 30;
		* ptrInt = * ptrInt + 40;
	
		ptrIntParent  = (int *) malloc(sizeof(int));
		* ptrIntParent = 50;
	
		printf("******************* parent after modify *******************\n");  
		printf("Now it is in parent process. I am %d.\n", getpid());      
		printf("local is %d, global is %d,  prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
		printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
		printf("ptrIntParent adress is %u, *prtIntParent is %d.\n",ptrIntParent,*ptrIntParent);	
		printf("******************* parent *******************\n");      
   
		wait();
		free (ptrInt);
	
		free (ptrIntParent);
	
	//free (ptrIntChild);
    }
 
}

运行结果

未利用sleep()做简单同步控制,混乱交替输出。

******************* parent before modify *******************
Now it is in parent process. I am 29849.
local is 0, global is 0, prtInt is 31371280, *prtInt is 0.
******************* child before modify *********************
local adress is 3061795072, global adress is 6299760, ptrInt adress is 31371280
******************* parent *******************
******************* parent after modify *******************
Now it is in parent process. I am 29849.
local is 20, global is 30,  prtInt is 31371280, *prtInt is 40.
Now it is in child process. I am 29850.
local adress is 3061795072, global adress is 6299760, ptrInt adress is 31371280
ptrIntParent adress is 31371312, *prtIntParent is 50.
******************* parent *******************
local is 0, global is 0,  prtInt is 31371280, *prtInt is 0.
******************* child *********************
******************* child after modify *********************
Now it is in child process. I am 29850.
local is 2, global is 3,  prtInt is 31371280, *prtInt is 4.
local adress is 3061795072, global adress is 6299760, ptrInt adress is 31371280
ptrIntChild adress is 31371312, *prtIntChild is 5.
******************* child *********************

示例2:父进程sleep,后输出

父进程利用sleep()做简单同步控制,父进程后输出。

代码示例

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

int global=0;

int main() {

    int local=0;
  
    int * ptrInt = NULL;
    ptrInt = (int *) malloc(sizeof(int)); 
    *ptrInt = 0;
  
    int * ptrIntParent = NULL;
    int * ptrIntChild = NULL;

    pid_t child;
  
    if ((child=fork()) == -1)   {
	// 创建失败
	printf("Fork Error.\n");
	
    }

    if (child == 0)  {
	// 子进程
	//sleep(1); // 请注释此行,看看执行效果差异。
	
		printf("******************* child before modify *********************\n");
		printf("Now it is in child process. I am %d.\n", getpid());
		printf("local is %d, global is %d,  prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
		printf("******************* child *********************\n");     

		local = local+2;
		global = global + 3;
		* ptrInt = * ptrInt + 4;
	
    	ptrIntChild = (int *) malloc(sizeof(int)); 
		* ptrIntChild = 5;
        
		printf("******************* child after modify *********************\n");
		printf("Now it is in child process. I am %d.\n", getpid());
		printf("local is %d, global is %d,  prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
		printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
		printf("ptrIntChild adress is %u, *prtIntChild is %d.\n",ptrIntChild,*ptrIntChild);	
		printf("******************* child *********************\n");     
	
		free (ptrInt);
	
    	free (ptrIntChild);
	
	//free (ptrIntParent);

		exit(0);
	
    }
    else  {
	 // 父进程
		sleep(1); // 请注释此行,看看执行效果差异。
   

		printf("******************* parent before modify *******************\n");  
		printf("Now it is in parent process. I am %d.\n", getpid());      
		printf("local is %d, global is %d, prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
		printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
		printf("******************* parent *******************\n");      

		local = local + 20;
		global = global + 30;
		* ptrInt = * ptrInt + 40;
	
		ptrIntParent  = (int *) malloc(sizeof(int));
		* ptrIntParent = 50;
	
		printf("******************* parent after modify *******************\n");  
		printf("Now it is in parent process. I am %d.\n", getpid());      
		printf("local is %d, global is %d,  prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
		printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
		printf("ptrIntParent adress is %u, *prtIntParent is %d.\n",ptrIntParent,*ptrIntParent);	
		printf("******************* parent *******************\n");      
   
		wait();
		free (ptrInt);
	
		free (ptrIntParent);
	
	//free (ptrIntChild);
    }
 
}

运行结果

父进程利用sleep()做简单同步控制,父进程后输出。

******************* child before modify *********************
Now it is in child process. I am 29864.
local is 0, global is 0,  prtInt is 11501584, *prtInt is 0.
******************* child *********************
******************* child after modify *********************
Now it is in child process. I am 29864.
local is 2, global is 3,  prtInt is 11501584, *prtInt is 4.
local adress is 2603507072, global adress is 6299768, ptrInt adress is 11501584
ptrIntChild adress is 11501616, *prtIntChild is 5.
******************* child *********************
******************* parent before modify *******************
Now it is in parent process. I am 29863.
local is 0, global is 0, prtInt is 11501584, *prtInt is 0.
local adress is 2603507072, global adress is 6299768, ptrInt adress is 11501584
******************* parent *******************
******************* parent after modify *******************
Now it is in parent process. I am 29863.
local is 20, global is 30,  prtInt is 11501584, *prtInt is 40.
local adress is 2603507072, global adress is 6299768, ptrInt adress is 11501584
ptrIntParent adress is 11501616, *prtIntParent is 50.
******************* parent *******************

示例3:子进程sleep,后输出

子进程利用sleep()做简单同步控制,子进程后输出。

代码示例

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>

int global=0;

int main() {

    int local=0;
  
    int * ptrInt = NULL;
    ptrInt = (int *) malloc(sizeof(int)); 
    *ptrInt = 0;
  
    int * ptrIntParent = NULL;
    int * ptrIntChild = NULL;

    pid_t child;
  
    if ((child=fork()) == -1)   {
	// 创建失败
		printf("Fork Error.\n");
	
    }

    if (child == 0)  {
	// 子进程
		sleep(1); // 请注释此行,看看执行效果差异。
	
		printf("******************* child before modify *********************\n");
		printf("Now it is in child process. I am %d.\n", getpid());
		printf("local is %d, global is %d,  prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
		printf("******************* child *********************\n");     

		local = local+2;
		global = global + 3;
		* ptrInt = * ptrInt + 4;
	
    	ptrIntChild = (int *) malloc(sizeof(int)); 
		* ptrIntChild = 5;
        
		printf("******************* child after modify *********************\n");
		printf("Now it is in child process. I am %d.\n", getpid());
		printf("local is %d, global is %d,  prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
		printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
		printf("ptrIntChild adress is %u, *prtIntChild is %d.\n",ptrIntChild,*ptrIntChild);	
		printf("******************* child *********************\n");     
	
		free (ptrInt);
	
    	free (ptrIntChild);
	
	//free (ptrIntParent);

		exit(0);
	
    }
    else  {
	 // 父进程
		sleep(1); // 请注释此行,看看执行效果差异。
   

		printf("******************* parent before modify *******************\n");  
		printf("Now it is in parent process. I am %d.\n", getpid());      
		printf("local is %d, global is %d, prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
		printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
		printf("******************* parent *******************\n");      

		local = local + 20;
		global = global + 30;
		* ptrInt = * ptrInt + 40;
	
		ptrIntParent  = (int *) malloc(sizeof(int));
		* ptrIntParent = 50;
	
		printf("******************* parent after modify *******************\n");  
		printf("Now it is in parent process. I am %d.\n", getpid());      
		printf("local is %d, global is %d,  prtInt is %u, *prtInt is %d.\n",local,global,ptrInt,*ptrInt);
		printf("local adress is %u, global adress is %u, ptrInt adress is %u\n",&local, &global,ptrInt);
		printf("ptrIntParent adress is %u, *prtIntParent is %d.\n",ptrIntParent,*ptrIntParent);	
		printf("******************* parent *******************\n");      
   
		wait();
		free (ptrInt);
	
		free (ptrIntParent);
	
	//free (ptrIntChild);
    }
 
}

运行结果

子进程利用sleep()做简单同步控制,子进程后输出。

******************* parent before modify *******************
Now it is in parent process. I am 29856.
local is 0, global is 0, prtInt is 12333072, *prtInt is 0.
local adress is 1863379008, global adress is 6299768, ptrInt adress is 12333072
******************* parent *******************
******************* parent after modify *******************
Now it is in parent process. I am 29856.
local is 20, global is 30,  prtInt is 12333072, *prtInt is 40.
local adress is 1863379008, global adress is 6299768, ptrInt adress is 12333072
ptrIntParent adress is 12333104, *prtIntParent is 50.
******************* parent *******************
******************* child before modify *********************
Now it is in child process. I am 29857.
local is 0, global is 0,  prtInt is 12333072, *prtInt is 0.
******************* child *********************
******************* child after modify *********************
Now it is in child process. I am 29857.
local is 2, global is 3,  prtInt is 12333072, *prtInt is 4.
local adress is 1863379008, global adress is 6299768, ptrInt adress is 12333072
ptrIntChild adress is 12333104, *prtIntChild is 5.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值