📜  fork()和二叉树

📅  最后修改于: 2021-05-30 12:00:35             🧑  作者: Mango

给定一个关于fork()系统调用的程序。

#include 
#include 
int main()
{
   fork();
   fork() && fork() || fork();
   fork();
  
   printf("forked\n");
   return 0;
}

执行上述程序后,将产生多少个进程?

fork()系统调用将生成过程作为成长中的二叉树的叶子。如果我们两次调用fork(),它将产生2 2 = 4个进程。所有这四个过程形成二叉树的叶子子代。通常,如果我们是l级,并且无条件调用fork(),那么我们将在( l + 1 )级拥有2个l进程。它等效于级别为( l + 1 )的二叉树中最大子节点的数量。

再举一个例子,假设我们无条件调用了fork()调用3次。我们可以使用具有3个级别的完整二叉树来表示生成的过程。在级别3,我们将有2 3 = 8个子节点,这对应于正在运行的进程数。

关于C / C++逻辑运算符的注释:

逻辑运算符&&的优先级比||高,并且具有从左到右的关联性。执行左操作数后,将估算最终结果,并且右操作数的执行取决于左操作数的结果以及操作的类型。

如果为AND(&&),则在对左操作数求值之后,仅当左操作数求值为非零时,才对右操作数求。如果是OR(||),则在评估左操作数之后,仅当左操作数评估为0时,才对右操作数进行评估。

fork()的返回值:

fork()的手册页引用了以下返回值摘录,

成功后,将在父级中返回子进程的PID,并在子级中返回0。失败时,将在父级中返回-1,不创建任何子级进程,并正确设置errno。

PID类似于进程的句柄,并表示为unsigned int 。我们可以得出结论,fork()将在父级中返回非零,在子级中返回零。让我们分析一下程序。为了便于注释,请如下所示标记每个fork(),

#include 
int main()
{
   fork(); /* A */
   ( fork()  /* B */ &&
     fork()  /* C */ ) || /* B and C are grouped according to precedence */
   fork(); /* D */
   fork(); /* E */

   printf("forked\n");
   return 0;
}

下图提供了分叉新流程的图形表示。所有新创建的进程都在树的右侧传播,而父级在树的左侧传播,依次连续。

前两个fork()调用是无条件调用的。

在级别0,我们只有主要流程。主体(图中的m)将创建子C1,并且两者都将继续执行。这些孩子按其创作的升序编号。

在级别1,我们正在运行m和C1,并准备执行fork()–B。(请注意,B,C和D分别命名为&&和||运算符)。初始表达式B将在此级别运行的每个子进程和父进程中执行。

在级别2上,由于由m和C1执行的fork()– B,我们将m和C1作为父级,将C2和C3作为子级。

fork()– B的返回值在父级中不为零,在子级中为零。由于第一个运算符是&&,所以由于返回值为零,因此子级C2和C3将不执行下一个表达式(fork()-C)。父进程m和C1将继续fork()–C。子进程C2和C3将直接执行fork()– D,以评估逻辑或运算的值。

在级别3,我们将m,C1,C2,C3作为运行进程,并将C4,C5作为子进程。现在将表达式简化为((B && C)|| D),此时(B && C)的值很明显。在父母中,它是非零,在儿童中,它是零。因此,父母意识到整体B && C的结果。 D,将跳过执行fork()–D。由于在评估为零的子级(B && C)中,它们将执行fork()–D。我们应注意,在级别2创建的子级C2和C3也将运行fork()– D,如上所述。

在第4级,我们将m,C1,C2,C3,C4,C5作为正在运行的进程,并将C6,C7,C8和C9作为子进程。所有这些进程无条件地执行fork()– E,并产生一个孩子。

在第5级,我们将运行20个进程。该程序(在Ubuntu Maverick上,GCC 4.4.5)打印了20次“分叉”。一次由根父母(主要)提供,其余由孩子休息。总体上将产生19个进程。

关于评估顺序的注意事项:

未指定二进制运算符中表达式的求值顺序。有关详细信息,请阅读操作数的评估顺序。但是,逻辑运算符是一个例外。他们保证从左到右进行评估。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”