c - 输出将如何打印?
问题描述
我正在对这段代码进行一些跟踪,并以打印 4 条语句结束,2 条用于父母,2 条用于儿童,但我想知道订单如何?我知道这取决于 CPU,它可能因一台计算机而异,但可能的解决方案是什么?因为我想到了这些语句可能会出现 6 种不同的顺序。
#include <stdio.h>
#include <sys/types.h> #include <unistd.h>
void forkExample()
{
int z = 8;
if (fork() == 0)
{
fork();
printf("Child with z = %d\n", ++z);
}
else
{
fork();
printf("Parent with z = %d\n", --z);
}
}
int main()
{
forkExample(); return 0;
}
解决方案
任何调用之间都没有顺序printf
——代码中的任何内容都不会导致任何进程中的任何调用出现在任何其他调用之前或之后。因此,任何 4! = 24 个订单是可能的。
(这假设每个输出都在另一个输出开始之前完全打印。C 或 Posix/Unix 不能保证这一点,但可能是使用默认缓冲区设置的短文本。)
虽然可以对实际调用进行 24 次排序,但有些消息无法区分,因为它们打印相同的文本。有两对相同的消息,所以可区分结果的数量是 24/2!/2! = 6。
推荐阅读
- java - ViewGroup 落后于 ViewPager Android Studio
- python - 如何在while循环中计算总和和平均值(python?)
- typescript - 如何在开玩笑的单元测试中使用 vue3 + typescript 在 shallowMount() 中添加假商店?
- reactjs - 在重定向时在 GetServerSideProps 中发送警报?
- asp.net - OAuth 刷新令牌无法始终如一地工作
- api - 更改新标签墙纸的 Chrome 扩展程序 - 不在 Chrome 操作系统中
- javascript - Django 成功提交表单
- python - 有没有办法将 seaborn 图表的图例移到图表之外或向右?
- javascript - 在预置 (x, y) 点模拟范围类型输入的 mousedown 事件
- python-3.x - Locust - drupal 网络表单请求