首页 > 解决方案 > 有人可以解释 fork() 吗?

问题描述

有人可以解释fork()并举例说明它的用途吗?

我从一些在线资源的理解是:

  1. fork() 创建一个与父进程运行相同的子进程。
  2. 将创建 2^n 个进程,n = fork() 的数量。
  3. 子进程的 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() - 子进程。

标签: clinuxfork

解决方案


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_1andchild_OF_1将拥有id == 0并进入 if 语句,而 child_2andparent将进入 else 语句并打印47

我忽略了第三个 fork() 到那时你有 8 个进程,其中 4 个将进入 if 语句,而其他将进入 else 块。这就是为什么你看到

i = 45 ; i = 47

4次!


推荐阅读