Linux 一道关于 fork 的笔试题

题目

阅读下面的代码,显示终端会打印出几个 hello world?

#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

int main()
{
	fork();
	fork();
	fork();
	printf("hello world\n");

	exit(0);
}

答案是多少呢?我们一起分析一下。

原理分析

关于 fork

fork() 函数会创建一个新的子进程。子进程得到与父进程用户级虚拟地址空间相同的一份副本,包括代码段数据段、堆、共享库、用户栈等。

fork 调用一次,返回两次:一次是返回到父进程。一次是返回到新创建的子进程。调用返回后,父进程和子进程各自继续执行后边的指令。

父进程和子进程并发独立运行,内核能够以任意方式交替执行它们的指令。

父进程和子进程有相同但是独立的地址空间。

父进程和子进程之间共享文件。即子进程会继承父进程所有打开的文件。

fork 嵌套分析

我们可以通过画图,来理解带有嵌套 fork 调用的程序。

在这里插入图片描述

为了方便看出是哪个 fork 执行,在图中用标号进行了标注。

第一个 fork 执行了 1 次。第二 fork 执行了 2 次,第三个 fork 执行了 4 次。最终有 8 个进程运行程序。

从而 printf 函数被调用了 8 次。

结果

根据以上分析可知,代码最终打印 8 次 hello world。

我们可以在 PC 上验证一下,编译、执行后的输出结果:

$ gcc fork.c
$ ./a.out
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world

实际结果与分析相同。

看来 fork() 不仅要会用,还要理解其背后的原理,还有就是掌握分析问题的方法。

如此,才能在遇到问题的时候,从容不迫。

加油~


公众号【一起学嵌入式】,精彩内容首先送达
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zsky_01

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值