【问题标题】:Getting different outputs for C program? What Should this program output?为 C 程序获得不同的输出?这个程序应该输出什么?
【发布时间】:2017-02-20 21:55:19
【问题描述】:

我正在尝试获取该程序的输出,但根据我运行它的环境,它似乎有所不同。

是 ABCADEABC 或 ABCABCADE 或 ABCADE 或 EABCDBC 或 EABCCD?

我相信我应该得到 ABCABCADE,但我想知道为什么当它们是相同的代码时我会得到不同的结果?

我应该得到什么?

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

int main(void) {
int pid;

    pid= fork();
    if (pid == 0) {
        fprintf(stdout, "A\n");
        pid= fork();
        if (pid==0) {
            fprintf(stdout, "B\n");
            pid=fork();
            fprintf(stdout, "C\n");
        }
        else {
            wait(NULL);
            fprintf(stdout, "D\n");
        }
    }
    else {
        fprintf(stdout, "E\n");
        wait(NULL);
    }
    // your code goes here
    return(0);
}

【问题讨论】:

  • 请将代码发布为可以复制/粘贴编译和运行的文本。发布显示问题的Minimal, Complete, and Verifiable example。清楚输入、预期输出和实际输出。我们只有一个图片链接和一些 ABC 华夫饼。还要说明它工作/不工作的环境。
  • 以文字而非图片的形式发布代码。剪切并粘贴问题中的代码并通过选择它并键入 Alt-K 来缩进它
  • 希望修复它

标签: c++ c linux fork


【解决方案1】:

操作系统的调度程序能够以它想要的任何顺序运行进程,因此无法保证语句将以哪个顺序执行。现代操作系统上的良好调度算法将考虑许多因素,例如就像进程的 IO 限制以及它使用了多少执行时间一样,抢先式上下文切换可能每秒发生约 60 次。当我们的进程与系统上可能有数百个其他进程一起运行时,我们无法准确确定这些因素将如何发挥作用,因此这些语句没有正确的顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    相关资源
    最近更新 更多