c - 将创建多少进程?
问题描述
除去最初的父进程,下面这段代码会创建多少个进程:
fork();
wait(0);
fork();
wait(0);
fork();
我在考虑 7 个进程,因为父亲总是等待孩子结束,但孩子永远不会退出。所以这将是 2**n - 1。
解决方案
每次调用 fork 函数都会创建一个新进程。每个进程(包括父进程)都将在其 fork 调用之后执行代码。每个父母都会等待其孩子死亡(请记住,当孩子调用 fork 时,它也会成为父母)。
绘制一个模式以确保:
这给出了 7 个进程,不包括父进程。
从最右边的分支读取树,然后以下注释可能有意义:
fork(); // Process 'c0' was created
wait(0); // Parent process 'p' waits for its child 'c0' to change state.
fork(); // c1, c4
wait(0); // c0, p
fork(); // c2, c3, c5, c6
我用打印报表和进程 ID 创建的Online Demo结果证实了这一点。
提醒中的0
论点wait()
:
等待其进程组 ID 等于调用进程的任何子进程。
阅读C - 并行执行 fork() 时 wait(NULL) 的含义中的更多内容。
请注意,如果您注释掉等待调用,进程数不会改变。
推荐阅读
- android-studio - 如何在开发移动应用程序时使用为对象检测训练的自定义模型?
- javascript - 如何在axios中将对象转换为数组
- c++ - 如何在一次字符串传递中擦除非字母字符并将字母字符小写?
- vector - 传递一个向量并对其执行操作会产生 X
- javascript - Heroku 无法为 discord.js 机器人加载画布,说“无效的 ELF 标头”
- c# - 反序列化自定义 XML 时出现 InvalidOperationException(缺少命名空间)
- apache-spark - 如何使用 Livy 在 Dataproc 中包含 BigQuery 连接器
- tensorflow - 使用 resnet50 训练模型时获取 ValueError 和 TypeError
- html - 如何使用边框半径和背景线性渐变创建元素 div 顶部垂直
- java - 自动生成的索引名超过 MySQL 最大命名长度