Linux 当fork在for循环中的问题

news2024/11/27 8:24:18

以下代码会打印几个"A"?

例1.代码如下:

int main(int argc, char* argv[],char* envp[])   
{      
	for(int i = 0;i < 2; i++ )   
    {   
		fork();   
		printf("A\n");   
	}   
	exit(0);  
}   
 

代码分析:

//父进程
	for(int i = 0;i < 2; i++ )   
    {   
		fork();   
		printf("A\n");   
	} 

此时i=0,进入循环,执行fork,产生一个子进程1:

//子进程1
	for(int i = 0;i < 2; i++ )   
    {   
		fork();   
		printf("A\n");   
	} 

父进程执行完fork之后会执行printf("A\n");输出"A"。然后执行for循环中的i++,i的值等于1,符合i<2,再次进入循环,又执行一次fork,再产生一个子进程2,并且会再执行printf("A\n");输出"A"。然后执行for循环中的i++,i的值等于2,不符合i<2,所以不进入循环。此时子进程2的for循环中的i的值变为了1:

//子进程2
	for(int i = 1;i < 2; i++ )   
    {   
		fork();   
		printf("A\n");   
	} 

子进程2是由父进程第二次进入循环的时候复制而来的,而子进程2中的fork在父进程进入第二次循环执行fork产生子进程2的时候已经执行完了,所以子进程2直接执行printf("A\n");输出"A"

这时,父进程的循环就结束了,接下来看子进程1的循环,父进程第一次执行fork的时候产生的子进程1如下:

//子进程1
	for(int i = 0;i < 2; i++ )   
    {   
		fork();   
		printf("A\n");   
	} 

这时子进程1for循环中i的值等于0,进入循环,这里的fork在父进程第一次进入循环执行fork产生子进程1的时候就已经执行完了,所以直接执行printf("A\n"); 输出"A"。然后执行for循环中的i++,i的值等于1,符合i<2,再次进入循环,执行fork产生子进程3,并且执行printf("A\n");输出"A"。子进程3如下:

//子进程3
	for(int i = 1;i < 2; i++ )   
    {   
		fork();   
		printf("A\n");   
	} 

此时,子进程3是由子进程1第二次进入循环复制而来的,所以子进程3中的fork在子进程1第二次进入循环执行fork产生子进程3的时候就已经执行完了,所以子进程3直接执行printf("A\n"); 输出"A"

运行结果:

一共输出6个A。

在这里插入图片描述
例2.代码如下:

int main(int argc, char* argv[],char* envp[])   
{   
	for(int i = 0;i < 2; i++ )   
	{   
         fork();   
         printf("A");   
    }  
    exit(0); 
}   

代码分析:

以上代码中在fork之后的printf("A"); 这条语句中没有"\n",所以输出的"A"没有办法输出到屏幕上,只能放在父进程的缓冲区,在fork之后,缓冲区所占的空间要复制给子进程。当i=0进入循环,第一次执行fork之后产生子进程1,然后执行printf("A"); ,这时"A"并没有输出到屏幕上,而是放到了缓冲区中,当i++之后,i等于1的时候再fork的时候会把缓冲区中的内容"A"复制一份给子进程2。所以子进程2在输出的时候会打印两个"A",而父进程中放到缓冲区的"A"会在父进程两次循环结束之后退出程序之后输出,存放到缓冲区中的"A"并不会不输出,而是在程序结束后输出。同理,子进程3在输出的时候会打印两个"A",而子进程1中放到缓冲区的"A"会在子进程1两次循环结束之后退出程序之后输出。所以这个题的答案会比第一个题的答案多出来两个"A"。

运行结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/877498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【分布式存储】数据存储和检索~LSM

在数据库领域&#xff0c;B树拥有无可撼动的地位&#xff0c;但是B树的缺点就是在写多读少的场景下&#xff0c;需要进行大量随机的磁盘IO读写&#xff0c;而这个性能是最差的。并且在删除和添加数据的时候&#xff0c;会造成整个树进行递归的合并、分裂&#xff0c;数据在磁盘…

frp实现内网穿透(超详细!)

一、 frp简介 FRP是Fast Reverse Proxy的缩写&#xff0c;它是一款开源、高性能、跨平台的内网穿透工具。FRP允许您通过安全地穿透NAT和防火墙来访问您的本地服务器&#xff0c;以便您可以从任何地方访问您的应用程序和服务。它的工作方式是将来自互联网的请求转发给本地网络中…

Linux命令200例:stat用于显示文件或文件系统的状态信息

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…

Flutter:简单搞一个内容高亮

内容高亮并不陌生&#xff0c;特别是在搜索内容页面&#xff0c;可以说四处可见&#xff0c;就拿掘金这个应用而言&#xff0c;针对某一个关键字&#xff0c;我们搜索之后&#xff0c;与关键字相同的内容&#xff0c;则会高亮展示&#xff0c;如下图所示&#xff1a; 如上的效果…

2004-2021年全国31省市场分割指数数据(原始数据+计算过程+最终结果+方法说明)

2004-2021年全国31省市场分割指数数据&#xff08;原始数据计算过程最终结果方法说明&#xff09; 1、时间&#xff1a;2004-2021年 2、来源&#xff1a;统计年鉴和国家统计局 3、指标&#xff1a;市场分割指数、食品类商品零售价格指数&#xff08;上年100&#xff09;、饮料、…

Java基础(十一)快速排序

4. 快速排序 >> 快速排序的思想 快速排序&#xff08;QuickSort&#xff09;是一种高效的排序算法&#xff0c;基于分治策略。它的原理可以概括为以下步骤&#xff1a; 选择一个基准元素&#xff08;pivot&#xff09;&#xff0c;通常选择数组中的一个元素作为基准。…

Linux知识点 -- 进程概念(补充)

Linux知识点 – 进程概念&#xff08;补充&#xff09; 文章目录 Linux知识点 -- 进程概念&#xff08;补充&#xff09;一、进程地址空间的堆区二、虚拟地址到物理地址之间的转化三、虚拟地址到物理地址之间的映射 一、进程地址空间的堆区 在用户每次使用malloc等函数在进程的…

c高级:day4

1.思维导图 2.shell函数获取uid和gid&#xff0c;并用变量接 #!/bin/bashfunction fun() {read -p "输入用户名" necho uid:id -u $necho gid:id -g $n } afun echo $a3.冒泡、选择和快排代码整理 /**************************************************************…

MQTT宝典

文章目录 1.介绍2.发布和订阅3.MQTT 数据包结构4.Demo5.EMQX 1.介绍 什么是MQTT协议 MQTT&#xff08;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的“轻量级”通讯协议&#xff0c;该协议构建于TCP/IP协…

opencv实战项目 手势识别-手势音量控制(opencv)

本项目是使用了谷歌开源的框架mediapipe&#xff0c;里面有非常多的模型提供给我们使用&#xff0c;例如面部检测&#xff0c;身体检测&#xff0c;手部检测等。 手势识别系列文章 1.opencv实现手部追踪&#xff08;定位手部关键点&#xff09; 2.opencv实战项目 实现手势跟踪…

探索 C++ 标准库:std::string 库函数用法示例

目录 引言 一、构造函数 1.1 string() 1.2 string (const string& str) 1.3 string (const string& str, size_t pos, size_t len npos) 1.4 string (const char* s) 1.5 string (const char* s, size_t n) 1.6 string (size_t n, char c&#xff09;​ 二、容…

剑指offer11-20

文章目录 11.旋转数组的最小数字12.矩阵中的路径13.机器人的运动范围15.二进制中1的个数16.数值的整数次方17.打印从1到最大的n位数&#xff08;待写&#xff09;18.删除链表的节点19.正则表达式匹配&#xff08;好难&#xff09;20. 没意义算了 11.旋转数组的最小数字 肯定不是…

【Git】—— 标签管理

目录 &#xff08;一&#xff09;理解标签 1、作用 &#xff08;二&#xff09;创建标签 &#xff08;三&#xff09;操作标签 1、删除标签 2、推送标签 3、删除远程标签 &#xff08;一&#xff09;理解标签 标签 tag &#xff0c;可以简单的理解为是对某次 commit 的…

C++11时间日期库chrono的使用

chrono是C11中新加入的时间日期操作库&#xff0c;可以方便地进行时间日期操作&#xff0c;主要包含了&#xff1a;duration, time_point, clock。 时钟与时间点 chrono中用time_point模板类表示时间点&#xff0c;其支持基本算术操作&#xff1b;不同时钟clock分别返回其对应…

Jenkins 监控dist.zip文件内容发生变化 触发自动部署

为Jenkins添加plugin http://xx:xx/manage 创建一个任务 构建触发器 每3分钟扫描一次&#xff0c;发现指定文件build.zip文件的MD5发生变化后 触发任务

脚本一键生成通用接口,一分钟实现增删改查

直接使用无需看此配置 快速生成通用接口业务配置 &#xff1a; https://blog.zysicyj.top/2023/08/14/快速生成通用接口业务配置 一、插件安装 二、脚本 关注绿色聊天软件【程序员朱永胜】回复&#xff1a;1013 下载 三、使用 拷贝到扩展目录下 修改mybatisCodehelper.vm 修改i…

【爱书不爱输的程序猿】CPOLAR+HFS,低成本搭建NAS

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 通过HFS低成本搭建NAS&#xff0c;并内网穿透实现公网访问 - cpolar 极点云 前言1.下载安装cpolar1.1 设置HFS访客1.2 虚拟文件系统 2. 使用cpolar建立一条内网穿透数据隧道2.1 保留…

强化学习 PPO算法和代码

PPO 效果 字体找不到 ubuntu python findfont: Font family ‘Alibaba PuHuiTi 3.0’ not found. shell 清除缓存&#xff1a; rm ~/.cache/matplotlib -rf到这里下载 阿里巴巴普惠体3.0 https://fonts.alibabagroup.com/ 然后安装字体 PPO import matplotlib from mat…

​​C++多态​​

目录 1. 多态的概念 2. 多态的定义及实现 多态的构成条件 虚函数 虚函数的重写 特例 override 和 final 1. final&#xff1a;修饰虚函数&#xff0c;表示该虚函数不能再被重写 2.override: 检查派生类虚函数是否重写了基类某个虚函数&#xff0c;如果没有重写编译报错…

【数据结构】二叉树篇|超清晰图解和详解:二叉树的最近公共祖先

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; 是瑶瑶子啦每日一言&#x1f33c;: 你不能要求一片海洋&#xff0c;没有风暴&#xff0c;那不是海洋&#xff0c;是泥塘——毕淑敏 目录 一、题目二、题解三、代码 一、题目 …