C语言 如何分叉 && 和 ||操作员工作?



我试图理解这个程序的输出。但我不明白。我读了关于fork及其工作原理的信息,并试图理解它,但是当我将其与&&或||运算符我不明白为什么输出不同。 有时我得到一个词,有时是2,3,4...

#include<unistd.h>
#include<stdio.h>

int main (int argc, char *argv[]) {
(fork()&&fork()) || fork();
printf("Testn");
return 0;
}

知道它是如何工作的吗?

有助于更好地理解此代码的内容:

1. fork 返回值 -当您在代码中的任何位置调用 fork 时,您将创建一个新进程,并且新进程也运行与父进程相同的代码。父进程和子进程之间的差异是从 fork 给出的返回值中知道的。对于子进程,fork 返回值等于 0,对于父进程,它不为零。

2. 短路逻辑评估 -在 C 语言中执行布尔逻辑时,执行以短路方式运行。

  • 对于语句 &&where and are 需要计算为 true 或 false 的 2 个表达式,仅当第一个表达式 (( 的计算结果为 true 时,才会检查第二个表达式 (( 的真实性。这是因为,如果本身为 false,则无论 的值如何,生成的逻辑表达式都变为 false,从而使 的评估变得无用。
  • 对于像 || 这样的语句,只有在 false 时才执行,原因与上面类似。

在你的代码片段中,在执行第一个fork((之后,子进程跳过第二个fork(由于&&的短路(并转到第三个fork((。结果"测试"打印2次。 然后,原始父进程遇到第二个 fork((,新的子进程继续执行第三个 fork(( 并再次打印 Test 2 次。父级跳过第三个 fork((,至于它,第一个和第二个 fork 都是非零的(||的短路(并打印"Test"一次。

因此,"测试"总共打印了5次。

P1 (fork-1)
/          
P2(fork-2)  P1 (fork-2)
/          /         
P3  P2     P4(fork-3)  P1
/  
P4   P5

根据分叉创建成功与否,输出应该有所不同。如果所有分叉都成功创建,则输出中应出现 5 次测试。

1-一个主线程输出。(1(

2-主线程创建两个分支(第一部分->(fork((&&fork((||第二部分->fork(((,因为第一部分评估为true,第二部分不在主线程中执行。所以这里应该看到两个输出。(1+2(

3-每两个创建的分叉创建一个新分叉,但第一部分不执行子分叉,但第二部分在每个子分叉中执行,因此在总共可以看到另外两个输出 5 个输出。(1+2+2(

首先:对不起这个问题。我没有做足够的研究,也没有把每个分叉都视为孩子和父母。

我学到的是:

  1. 第一个分叉将运行,它将创建一个子分叉。现在我们有 2 个进程,父返回一个不等于 0 的数字,子返回 0。
  2. 因为父级返回的数字不是 0,所以 && 之后的分叉也会运行,它会创建另一个子进程。1 子进程返回 0,因此它不会在 &&.我们现在有 3 个流程
  3. || 之后的分叉不会为级运行,因为它返回了一个不是 0 的数字,但它会为子级运行,因为它返回了 0,所以我们最终得到 5 个进程。希望我是对的

最新更新