c - 用 && 和 || 怎么分叉 运营商工作?
问题描述
我正在尝试了解该程序的输出。但我不明白。我读到了 fork 以及它是如何工作的,我试图理解它,但是当我将它与 && 或 || 混合使用时 操作员我不明白为什么输出不同。有时我得到一个字,有时是 2、3、4...
#include<unistd.h>
#include<stdio.h>
int main (int argc, char *argv[]) {
(fork()&&fork()) || fork();
printf("Test\n");
return 0;
}
知道它是如何工作的吗?
解决方案
有助于更好地理解此代码的内容:
1.fork返回值——当你在代码中的任何地方调用fork时,你就创建了一个新进程,新进程也运行与父进程相同的代码。从 fork 给出的返回值可以知道父进程和子进程的区别。对于子进程,fork返回值等于0,对于父进程,它是非零的。
2. 短路逻辑评估 -在 C 中执行布尔逻辑时,执行以短路方式运行。
- 对于语句 && where and are 2 需要被评估为真或假的表达式,只有当第一个表达式 () 被评估为 true 时,才会检查第二个表达式 () 的正确性。这是因为,如果本身为假,那么无论 的值如何,生成的逻辑表达式都会变为假,因此使评估无用。
- 对于像 || 这样的声明 , 仅在为 false 时执行,原因与上述类似。
在您的代码片段中,执行第一个 fork() 后,子进程跳过第二个 fork(由于 && 短路)并转到第三个 fork()。导致“Test”打印了 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
推荐阅读
- java - Spring JPA Repository 合并而不是保存
- php - 多选自动完成文本框无法正常工作
- python-3.x - KeyError: ('', '发生在索引 0')
- ios - 将 UIBarButtonItem 转换为 UIButton
- c++ - cocos2d-x 3.17v中如何创建字符串数组
- mysql - .Net CLI MySQL RDS 连接失败
- webpack - Webpack 4 配置未显示源映射文件
- ios - 文本字段中有多少个字母和数字特殊字符
- amp-html - 如何使用 amp-img 将 webp 回退到 jpg?
- php - 无法使用 mpdf 设置背景图像