当前位置: 首页 > news >正文

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

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

//循环创建n个子进程
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>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,创建出的子进程将再次进入循环创建孙进程,就会导致以下事件出现:
在这里插入图片描述
由于创建子进程之后,父进程还需要继续执行循环以便完成循环创建任务,故在这个过程中 i 值还会继续发生变化,根据写时复制技术,当父进程要对 i 值进行改动时,操作系统会创建 i 值所在页面的副本,然后将这个副本映射到相应需要对页面进行修改的进程的地址空间,此时父进程要修改的 i 值是属于它自己的,与子进程所映射的页面的 i 值无关。

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

在这里插入图片描述

http://www.lryc.cn/news/112034.html

相关文章:

  • 【SpringBoot面试题整理-超级有效】
  • 岩土工程仪器多通道振弦传感器信号转换器应用于隧道安全监测
  • 西瓜书读书笔记整理(五)—— 第四章 决策树
  • STM32 4G学习
  • Golang 中实现实时聊天通讯
  • 前端面试的性能优化部分(5)每天10个小知识点
  • 【链表OJ 1】移除链表元素val
  • 复原 IP 地址——力扣93
  • OSPF综合实验
  • 安卓4G核心板开发板_MTK6785/MT6785(Helio G95)安卓手机主板方案
  • Linux 匿名页的生命周期
  • 设计模式概述与UML图
  • 使用Vscode编辑keil工程
  • 编译工具:CMake(一) | 简介与安装
  • 深度学习(34)—— StarGAN(1)
  • ES6系列之let、const、箭头函数使用的坑
  • 4.DNS和负载均衡
  • 【JavaEE进阶】Spring核心与设计思想
  • 实习周记第三周
  • 11. 使用tomcat中碰到的一些问题
  • C++解决TCP粘包
  • 最长快乐前缀——力扣1392
  • 使用java.util.List的containsAll()方法可能导致的问题
  • 在线文本转语音播放 (TTS)
  • OPTEE之ARM安全扩展
  • Vue [Day4]
  • google chrome 官方下载
  • Misc取证学习
  • vue打包到jar资源访问被shiro拦截
  • 选择排序(指针法)