c - 有人可以解释 fork() 吗?
问题描述
有人可以解释fork()
并举例说明它的用途吗?
我从一些在线资源的理解是:
- fork() 创建一个与父进程运行相同的子进程。
- 将创建 2^n 个进程,n = fork() 的数量。
- 子进程的 ID 将始终为 0,而父进程的 ID 将是其他值 - 正整数!= 0。
我还有另一个问题,首先请看下面我的代码:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main() {
int id = fork();
int i = 45;
fork();
fork();
if(id == 0) {
printf("\nChild Process id = %d",id);
printf("\ni = %d ; i = %d",i++,i);
}
else {
printf("\nParent Process id = %d",id);
printf("\ni = %d ; i = %d",i,i+2);
}
return 0;
}
/*
O/P:
Parent Process id = 9048
i = 45 ; i = 47
Parent Process id = 9048
i = 45 ; i = 47
Parent Process id = 9048
i = 45 ; i = 47
Parent Process id = 9048
i = 45 ; i = 47
Child Process id = 0
i = 45 ; i = 46
Child Process id = 0
i = 45 ; i = 46
Child Process id = 0
i = 45 ; i = 46
Child Process id = 0
*/
为什么最后一个子进程不显示第二个 printf() 即,
printf("\ni = %d ; i = %d",i++,i);
您能否解释一下为什么在第 8 次执行第一个 printf() 时没有执行第二个 printf() - 子进程。
解决方案
fork() 创建与父进程相同运行的子进程。
真的。fork() 创建一个子进程,该子进程是其父进程的副本。
将创建 2^n 个进程,n = fork() 的数量。
取决于代码!
int i = 0;
while (i < n)
{
fork();
i++;
}
在这里,假设没有 fork() 失败,那么是的,会有 2^n 个进程。
子进程的 ID 将始终为 0,而父进程的 ID 将是其他值 - 正整数!= 0。
子进程中的fork()返回值为0!不是id,而是返回值!父进程中 fork() 的返回值是子进程的实际 pid。
现在到你的代码
1. int main() {
2. int id = fork();
3. int i = 45;
4. fork();
5. fork();
6. if(id == 0) {
7. printf("\nChild Process id = %d",id);
8. printf("\ni = %d ; i = %d",i++,i);
9. }
10. else {
11. printf("\nParent Process id = %d",id);
12. printf("\ni = %d ; i = %d",i,i+2);
13. }
14. return 0;
15. }
在第 4 行,有 2 个进程
parent | child_1
id > 0 | id == 0
i == 45 | i == 45
现在调用了一个 fork
parent | child_1 | child_OF_1 | child_2
id > 0 | id == 0 | id == 0 | id > 0
i == 45 | i == 45 | i == 45 | i == 45
child_1
andchild_OF_1
将拥有id == 0
并进入 if 语句,而
child_2
andparent
将进入 else 语句并打印47
我忽略了第三个 fork() 到那时你有 8 个进程,其中 4 个将进入 if 语句,而其他将进入 else 块。这就是为什么你看到
i = 45 ; i = 47
4次!
推荐阅读
- amazon-web-services - Redshift 计划查询错误通知
- godot - 空袭戈多
- javascript - WebStorm 无法自动完成样式化组件
- python - 代码从字典中删除重复字母
- google-chrome - 为什么 Google Chrome 不支持“链接”标头?
- command-line - Drush 错误:调用未定义的方法 Symfony\Component\Config\Definition\BaseNode::resetPlaceholders()
- r - 如何在“polynom::polynomial”对象中强制使用尾随零?(特别是从 ggpubr 修改 stat_lm 和 stat_regline_equation 的行为)
- linux - Linux:systemd 目标依赖项
- macos - 在 macOS 上使用 RealityKit ARView
- java - 使用 apache PDFBox 删除图像时删除空白