专栏首页Linux内核及编程语言底层相关技术研究他们说,这段代码你能看得懂她的开始,却猜不中她的结尾。

他们说,这段代码你能看得懂她的开始,却猜不中她的结尾。

看下小姐姐,舒缓下心情先。


好,现在回到我们的主题,看下下面这段代码,你觉得它会输出几个#号呢?

这个问题来自于我们技术群里的一位同学的提问,为了给大家一个思考时间,我们先不说结果,先再看下另一位可爱的小妹妹。


啊,好可爱啊,为啥我选择了技术,而没去学画画


好,不知道你想得怎么样了呢?

我们先来执行下,看下其具体输出。

看到没,8个,不知道你有没有猜对呢?

可为什么是8个呢,你要说2个我能理解,3个我也能理解,为什么偏偏是这么夸张的8个

其实这道题目主要考察两个点,第一个点就是fork的作用,如果你不理解fork,那你肯定认为输出的个数就是2个。

fork的作用其实就是拷贝当前进程,然后创建一个原样的子进程,子进程开始时执行的代码,就是父进程调用fork之后的代码。

对于我们上面的题目来说,子进程就是进入了下一次for循环。

详细的fork文档可以参考下面的链接:

https://man7.org/linux/man-pages/man2/fork.2.html

因为fork函数创建子进程,进而也会有#号输出,把这个考虑在内的话应该是3个#号,因为主进程会输出2个,主进程第一次for循环创建的子进程,在其进入到下一次循环时又会输出一个。

其他的因为主进程,或者是该子进程调用fork方法,创建的进一步的子进程再进入到for循环时,因为不满足 i < 2,会直接跳出循环,也就是说不会再输出#号。

那这样说也应该是3个#号啊,为什么是8个呢?

这里就涉及到了第二个知识点,printf。

为了减少系统调用次数,提高程序性能,我们每次调用printf时,并不会立即触发一次系统调用,而是会先写到printf的buffer区,如果buffer区满了,或者说写入字符中有\n换行符,才会真正的触发一次系统调用,将我们buffer中的printf的内容输出到控制台。

这也是有时我们写程序时,经常会发现明明调用了输出方法,但控制台上就是没有输出的一个常见原因。

好,再次回到我们的题目。

由上图我们可以看到,我们在for循环里调用的printf,都是没有加上\n换行符的,我们只有在进程结束前的printf才加上,也就是说,for循环里的printf,只是把我们的内容放到了它的buffer中,并没有真正输出。

那有意思的事就来了。

当我们后面再调用fork时,fork可是拷贝当前进程的全部内存的,这可是包括printf的buffer区的,举例来说,当我们主进程执行第二次for循环,调用fork时,此时的printf的buffer里已经有两个#号了,此时fork一个子进程,子进程中的相应buffer区里也会有这两个#号。

当主进程或子进程退出之前,遇到最后一个带有\n换行符的printf时,就会把buffer中现有的那两个#号输出出来,即每一个进程都会因为同样的原因,最终输出2个#号。

再看下我们的代码,算上主进程,一共创建了4个进程,那最终输出的可不就是8个#号嘛。

小知识,大学问!

不知道你有没有猜中这样的结尾呢?


写文章不易,如果可以的话,欢迎大家转发或给个在看,没关注的也可以关注下,希望以后能给大家带来更多的惊艳文章。

本文分享自微信公众号 - Linux内核及JVM底层相关技术研究(ytcode),作者:wangyuntao

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 程序猿用 C语言实现一封 中文情书,代码很简单!【附源码】

    代码很简单,就是全部用宏定义进行替换,但是以为引用了中文,需要Unicode码的支持,能在VS2005及其以上版本编写调试 ↓↓↓

    小林C语言
  • 如果 TCP 是一场恋爱:遇到心动的女孩时,如何去把握?

    来源 | http://segmentfault.com/a/1190000019052710

    五分钟学算法
  • Android程序员年后跳槽,你准备好了嘛?

    春节刚结束,估计大多数人又开始蠢蠢欲动了,没办法每一年的三四月份都是互联网人换工作的高峰期,这个时间段也被称为招聘领域的黄金岁月、招聘旺季,素来是金三银四,大部...

    Android技术干货分享
  • 详解三次握手和四次挥手:遇到心动的女孩时,如何去把握?

    这篇文章作者真的是用故事来详解 TCP 的三次握手和四次挥手,我相信能用通俗易懂的语言讲出来的东西,那么作者一定是理解得非常的透,真心不错,推荐给大家。

    桃翁
  • IT人为了家庭和自己请保重自己~活在当下!

    IT架构圈
  • Python 告诉你绝不知道的1983-2018 春晚

    马上就要过年了,距离 2019 己亥猪年的除夕已不足一个礼拜,提起除夕,多数人马上想到「春节联欢晚会」这道丰盛的「年夜大餐」。看过那么多春晚,哪一年、哪些节目、...

    CDA数据分析师
  • 前Facebook高管也搞起了“脑机接口”: 用一顶帽子实现“灵感下载”

    大数据文摘
  • 写给程序猿的把妹指南:概述篇

    每个女人,都是一套复杂的系统,只不过,这套系统不是由程序员创造的,而是由大自然进化而成的。大部分程序猿不太懂得如何泡妞,是因为你不熟悉女人这套系统,也没人教过你...

    Keegan小钢
  • 数据分析师,如何向亲友解释自己的工作

    临近过年,很多小伙伴已经回家和亲戚朋友团聚,长时间不见,自然少不了嘘寒问暖灵魂拷问的环节。

    接地气的陈老师
  • 520试了大佬的表白神器,被女友无情拉黑,最后靠这个必杀技,真香!

    点份炸鸡和奶茶,虽然外卖要天亮以后才能送,我氪金也还是过不去那一关。罢了,乐于助人、乐善好施、雪中送炭的场主,怎么会计较这些?分享一波硬技能,素材来源于网络,取...

    养码场
  • 华裔女孩“美国梦”:从清洁工到领军谷歌回中国做AI,她实现人生逆袭

    最实用、最超前的美国移民和投资动态 12月13日,Google宣布Google AI 中国中心(Google AI China Center)于北京正式成立,大...

    企鹅号小编
  • 体检异常率97%,这届90后身体到底有多差

    导读:90后打开体检报告单的心情就像是开奖,字越少越开心。但可惜的是,事与愿违。上海外服联合《大众医学》发布的《2018上海白领健康指数报告》显示,2017年上...

    华章科技
  • 读心:情感计算步步进入商业调研领域

    现在,在理解、存储海量信息方面,机器似乎越来越高能了——但是它们和以前一样,在情感方面却没什么进展。不过,从 1990 年代以来,一小部分研究者致力于让计算机能...

    用户1756920
  • 程序员面试技巧总结

    程序员面试技巧总结 闲聊 在深入代码之前,大多数面试官喜欢聊聊你的背景。他们想知道: 你对编码认知。你是否知道如何编写好代码? 个人能力/领导力。你是否经历过...

    用户1289394
  • 有个姑娘网恋奔现发现自己被人卖了,跟她见面的是另一个人。

    十多天前,我接到一条线索,原本以为是一件很普通的事,当我追查的时候发现和暗网有牵连,自己不但暴露了还被对方反查到真实身份。

    帅地
  • 程序员面试技巧总结

    热爱技术。表达你对你所做的一切感到骄傲,你对自己的选择充满自信,你对语言和工作流有着自己的看法。

    哲洛不闹
  • 为了亲妹,我下C海了!

    关注我比较久的读者应该知道,我是一名正儿八经的 Java 程序员,没用过 C 语言,也没有学过 C 语言,直到前几天我妹给我抱怨说,学校安排她们学的 C 语言太...

    沉默王二
  • 520写了个程序送她当礼物,翻车了!

    每到这种日子,最头疼的就要数送礼物这件事了,在这件事上,我绝对是有发言权的————反面教材的发言权。

    轩辕之风
  • 【秘籍】程序员高薪面试技巧

    面试就像高考,分数优异,不一定能进入好大学,面试亦是如此,能力强不一定能进入到自己心仪的公司,因为这个不仅和技术有关,还和自己的综合素质与临场发挥有关。今天老九...

    老九君

扫码关注云+社区

领取腾讯云代金券