gpt4 book ai didi

c++ - 我想了解一系列 fork() 函数是如何工作的?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:10:20 24 4
gpt4 key购买 nike

我想了解下面的 fork() 函数序列是如何工作的?

                #include <iostream>
#include <sys/types.h>
#include <unistd.h>
using namespace std;
int main() {
fork(); cout << "1 " << endl;//calling fork 1
fork(); cout << "2 " << endl; // calling fork 2
fork(); cout << "3 " << endl;// calling fork 3

fork(); cout<<" 4 "<<endl;//calling fork 4
return 0;
}
  1. 我上面程序的流程结构会不会是这样的,我的假设是否正确?

                                     parent(x)
    / | | \
    1 2 3 4
    / | \ / \ |
    2 3 4 3 4 4
    / \ | |
    3 4 4 4
    |
    4
    • 根据我的理解,该程序将生成 16 个进程,对吗?

    • 有没有可能先输出3再输出2?如果是这样,如何以及为什么?

最佳答案

As per my understanding the program will generate 16 processes am I right?

第一个进程将 fork 出一个新进程。那是一个。现在有两个进程在运行。

这两个进程随后将作为第二个 fork 的结果创建另外两个进程。现在有四个进程在运行。

下一个分支导致八个正在运行的进程。

最后一个 fork 导致 16 个进程在运行。这比您开始时多了 15 个,因此,总的来说, fork 创建了 15 个新进程。

Is it possible to output 3 before 2? if so How and why?

是的,从一个非常孤立的角度来看,它有可能发生。 3 永远不会出现在第一个 2 之前,但 3 后面可能会出现 2。

为了打印“3”,必须打印“2”。对于单个进程,没有在“2”之前打印“3”的执行路径。

但是:

fork();   cout << "2 " << endl; 

在这个分支之后有四个进程在运行。没有什么可以保证在他们或他们的后代都打印出他们的“3”之前,他们所有人都会打印出“2”。

例如,四个进程中的一个可能会被操作系统降低优先级,并且不会达到它的 cout << "2"。直到其他三个进程打印他们的 2s,fork 并打印他们的 3s。现在,在其他进程已经脱口而出它们的“3”之后, sleep 进程醒来并打印它的“2”。最终结果将是“3”后跟“2”。

但是在这些“3”之前必须有其他“2”。

关于c++ - 我想了解一系列 fork() 函数是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42682678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com