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

Linux 当fork在for循环中的问题

以下代码会打印几个"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:

//子进程1for(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:

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

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

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

//子进程1for(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如下:

//子进程3for(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.lryc.cn/news/124857.html

相关文章:

  • 推断统计中非参数检验之卡方检验、列联表分析和游程检验
  • AI社交来了,百度、Soul“双向奔赴”
  • 【【verilog 典型电路设计之加法器树乘法器】】
  • 选择最适合自己的NIO, 一探流技术
  • 智能家居(3)---socket网络控制线程封装
  • ubuntu 安装 emscripten 时 install latest 安装报错问题
  • concrt140.dll丢失怎么恢复?教你5种修复方法
  • 【Vue-Router】路由入门
  • 蓝牙耳机运动耳机哪个好、好用的运动蓝牙耳机推荐
  • 大数据面试题:Kafka的ISR机制
  • Windows:解决MySQL登录ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using passwor=YES)问题
  • springboot整合kafka多数据源
  • 基于CentOS 7 配置nginx负载均衡
  • WordToPDF2.java
  • k8s服务注册发现
  • IK分词器升级,MySQL热更新助一臂之力
  • 泛微 E-Office文件上传漏洞复现
  • bug的生命周期
  • mysql分库分表相关
  • 云原生k8s---资源限制、探针
  • html2canvas生成图片地址Base64格式转成blob在转成file(二进制)可正常发送(保姆教程,复制粘贴可用)
  • 将Linux上的cpolar内网穿透配置为开机自启动——“cpolar内网穿透”
  • 微信小程序data-item设置获取不到数据的问题
  • 创建百度百科需要什么条件?
  • 【springboot启动报错】java: 错误: 无效的源发行版:17
  • 无涯教程-Perl - setservent函数
  • Java创建多线程的最全方法
  • 02 qt基本控件及信号和槽
  • 大数据校招学员实习面试分享
  • 用于弥散加权MRI的关节各向异性维纳滤光片研究(Matlab代码实现)