代码分析:循环创建N个子进程——为什么最后一个属于父进程?

黑马C/C++ 2018年32期代码分析

//循环创建n个子进程
#include 
#include 
#include 
#include 
#include 

int main()
{
	int i = 0;
	for(i=0; i<3; i++)
	{
		//创建子进程
		pid_t pid = fork();
		if(pid<0) //fork失败的情况
		{
			perror("fork error");
			return -1;
		}
		else if(pid>0)//父进程
		{
			printf("father: pid==[%d], fpid==[%d]\n", getpid(),getppid());
			//sleep(1);
		}
		else if(pid==0) //子进程
		{
			printf("child: pid==[%d], fpid==[%d]\n", getpid(), getppid());
			break; //这句话非常重要,创建出的子进程并不会并发地和父进程一起继续执行余下的for循环语句,而是跳出循环,
		}
	}

	//第1个子进程
	if(i==0)
	{
		printf("[%d]--[%d]: child\n", i, getpid());	
	}

	//第2个子进程
	if(i==1)
	{
		printf("[%d]--[%d]: child\n", i, getpid());	
	}
	//第3个子进程
	if(i==2)
	{
		printf("[%d]--[%d]: child\n", i, getpid());	
	}
	//父进程
	if(i==3)
	{
		printf("[%d]--[%d]: child\n", i, getpid());	
	}
	sleep(10);

	return 0;
}

代码中的break:创建出的子进程并不会并发地和父进程一起继续执行余下的for循环语句,而是跳出循环。如果没有break,创建出的子进程将再次进入循环创建孙进程,就会导致以下事件出现:
代码分析:循环创建N个子进程——为什么最后一个属于父进程?_第1张图片
由于创建子进程之后,父进程还需要继续执行循环以便完成循环创建任务,故在这个过程中 i 值还会继续发生变化,根据写时复制技术,当父进程要对 i 值进行改动时,操作系统会创建 i 值所在页面的副本,然后将这个副本映射到相应需要对页面进行修改的进程的地址空间,此时父进程要修改的 i 值是属于它自己的,与子进程所映射的页面的 i 值无关。

因此在代码中 i = 3 时,打印出来的是父进程。

代码分析:循环创建N个子进程——为什么最后一个属于父进程?_第2张图片

你可能感兴趣的:(代码分析,进程,C++,C/C++)