为什么命令提示符和 PowerShell 给出的输出结果与终端不同?

Jin*_*nzu 2 linux cygwin powershell linux-terminal cmd.exe

我有一本书中的以下示例代码:

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

int main(int argc, char *argv[])
{
  printf("Hello World (pid:%d)\n", (int) getpid());
  int rc = fork();

  if (rc < 0)
  {
    //fork failed
    fprintf(stderr, "fork failed\n");
    exit(1);
  }

  else if (rc == 0)
  {
    //child (new process)
    printf("Hello I am child (pid:%d)\n", (int) getpid());
  }

  else
  {
    //parent goes down this path (main)
    printf("Hello, I am parent of %d (pid:%d)\n",
            rc, (int) getpid());
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在 Windows(powershell 和命令提示符)中,我得到以下信息:

Hello World (pid:1283)
Hello, I am parent of 1284 (pid:1283)Hello I am child (pid:1284)
Run Code Online (Sandbox Code Playgroud)

在 Linux(终端)中我得到:

Hello World (pid:1923)
Hello, I am parent of 1924 (pid:1923)
Hello I am child (pid:1924)
Run Code Online (Sandbox Code Playgroud)

如下图所示。

为什么相同的代码在不同的程序中显示不同?Windows 是否只是根据其读取代码的方式错误地显示了输出?或者是它的编译器有什么问题?我在 Linux 上使用附带的 gcc。我在 Windows 上使用 cygwin gcc。

Windows 上的 PowerShell

powershell-windows

Linux 上的终端

终端linux

Windows 上的命令提示符

cmd窗口

还运行此代码:

#include <stdio.h>

int main()
{
    printf("Name\n");
    printf("Address Line 1\n");
    printf("Address Line 2");
}
Run Code Online (Sandbox Code Playgroud)

在 Windows 上的 PowerShell 中正确打印代码。

在此输入图像描述

dav*_*085 5

对于 Cygwin 来说,有一个明显的竞争条件,它输出形成行主体的字符,然后输出行结束符 ( CRLF),并且另一个进程能够介于两者之间,因此您实际上得到了body1 body2 CRLF CRLF(为了清楚起见,添加了间距)。

\n\n

标准 C 禁止标准输出到“交互式设备”进行完全缓冲(即多于一行),但允许较少的缓冲,以及在任何情况下操作系统(C 正式称为“主机环境”)如何处理来自多个进程的输出一旦“传输”到它就完全超出了 C \xe2\x80\x94 的范围,甚至在这种情况下 POSIX 如果我\xe2\x80\x99m 没有误认为 \xe2\x80\x94 不是 Cygwin 可以完全满足 POSIX 无论如何。

\n