0
点赞
收藏
分享

微信扫一扫

关于fork()函数printf(“-“)和printf(“-\n“)输出几个杠

小典典Rikako 2022-04-01 阅读 109
c++

问题描述

关于这段代码到底会输出几个 ‘-’ ?

for (int i = 0; i < 2; i++)
{
    fork();
    printf("-\n");
}

解决方案:

这是看别人的博客加上自己的理解之后作出的简单的解释,我感觉大佬写的我都很懵逼,我是菜鸡,我来说说我的理解,要是错了,轻喷。

按我的理解先简单说一下fork(),这个函数就是会复制,啥都复制,包括输出的‘-’。我们来画图理解一下。
在这里插入图片描述第一次循环开始,初始进程(你要是问为什么开始有一个进程?那么我要说,你要执行程序总得有一个进程来执行吧)自身复制了一个自己,因为没有执行输出语句,所以进程里什么都没有,然后开始执行输出语句,这里有个重点了,就是输出语句到底是printf("-\n")还是printf("-")

情况1:printf("-\n")
图1执行printf("-\n"),我们假设是从前到后执行,所以先执行了printf("-")所以两个进程中都出现了’-’(为什么两个进程都有,我也不明白,去问大佬),用图中红色线标识,然后继续向后执行遇到了**"\n"**,进程中的数据输出,这个时候已经输出两个’-'了,然后清空(你要问我为什么,我也不知道,去看大佬解释,他们这么说,我就这么做),就又变回了第一幅图,然后执行第二次循环,变成如下图:
在这里插入图片描述也就是再次复制产生四个进程,继续如上述过程开始printf("-\n"),此处不再赘述。
在这里插入图片描述四个进程再输出(四个‘-’),再清空,程序结束,一共输出了6个’-’。

情况2:printf("-")
初始到第一次循环打印的情况一样。
在这里插入图片描述此处注意,没有"\n"!!! 故’-‘不会输出而且进程中的’-‘不会被清除。
开始第二次循环,因为没有进程中’-‘没有被清除所以会连同’-‘进行复制!
执行fork()函数之后:
在这里插入图片描述继续执行下一行代码printf("-"):
这次输出的’-‘我们用蓝色表示。
在这里插入图片描述然后循环结束,输出进程中的’-’,红色加蓝色一共8个
至此,解释清楚这个程序到底是怎么一回事了。

举报

相关推荐

0 条评论