c - 当 fork() 处于某个条件时会发生什么?
问题描述
谁能给我这段代码的输出(带有解释)?谢谢...
#include <stdio.h>
#include <unistd.h>
int main()
{
if (fork() && (!fork())) {
if (fork() || fork()) {
fork();
}
}
printf("Friend\n");
return 0;
}
解决方案
在进入代码之前,最好了解什么是 fork() 系统调用
fork() 系统调用由“父”进程创建一个新进程,新创建的进程称为“子”进程
当 fork 成功时,子进程返回 0,父进程返回正整数
这就是这里的线索
因此,从该程序计数器开始,所有两个进程都同时工作......
在这里 fork() 处于 if 条件下,在猜测输出时也有点棘手
第一个 fork() 创建新的 C1 -> 0
第二个 fork() 创建新的 C2 -> !0 -> 1
所以第一个条件由 C2 (哪个父正整数和 c2 的 0)统计,但没有由父 C1 或子 C1 统计,所以其他叉子不会工作
然后C2进入另一个if条件并制作另外两个叉子
C2
/ \
C2 C3
/ \ / \
C2 c4 c3 c5
然后所有创建的进程(包括父进程)打印“朋友”输出 7 次
推荐阅读
- r - 如何使用 R 绘制带有自定义标题的两列时间序列网格?
- angular - 如何在 ngx-bootstrap typeahead 中检索对象的键?
- python - 哪里错了?我尝试编写一个将矩阵相乘并出现“NonType”错误的程序
- elasticsearch - 英国邮政编码的 Elasticsearch 映射,能够处理间距和大写
- firebase - 如何在 cloudflare 上使用 DNS 将 Firebase authDomain url 更改为自定义域
- python - 使用 pyparsing 使用 `delimitedList` 设置最大出现次数
- c# - 避免 C# 代码中多个控制器的冗余
- flutter - 如何在颤振(飞镖)中解决未来?
- r-caret - caret 中的 blassoAveraged 模型真的是岭模型吗?
- python - 从嵌套列表中删除负元素并对列表进行平方而不使用循环