我有一本书的以下示例代码:
#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;
}
在 Windows(powershell 和命令提示符)中,我得到以下信息:
Hello World (pid:1283)
Hello, I am parent of 1284 (pid:1283)Hello I am child (pid:1284)
在 Linux(终端)中,我得到:
Hello World (pid:1923)
Hello, I am parent of 1924 (pid:1923)
Hello I am child (pid:1924)
如下图所示。
为什么相同的代码在不同的程序中显示不同?Windows 是否只是根据它读取代码的方式错误地显示输出?或者它的编译器是什么?我在 Linux 上使用包含的 gcc。我在 Windows 上使用 cygwin gcc。
Windows 上的 PowerShell
Linux 上的终端
Windows 上的命令提示符
还运行此代码:
#include <stdio.h>
int main()
{
printf("Name\n");
printf("Address Line 1\n");
printf("Address Line 2");
}
在 Windows 上的 PowerShell 中正确打印代码。
对于 Cygwin 来说,显然存在一个竞争条件,它输出形成行主体的字符,然后是行尾 (
CRLF
),并且另一个进程能够介于两者之间,因此您实际上得到body1 body2 CRLF CRLF
了(为清楚起见,添加了间距)。标准 C 禁止“交互式设备”的标准输出被完全缓冲(即多行),但允许更少,并且无论如何操作系统(C 正式称为“主机环境”)如何处理来自多个进程的输出一旦“传输”到它完全超出了 C 的范围——如果我没记错的话,甚至在这种情况下是 POSIX——并不是说 Cygwin 无论如何都可以完全满足 POSIX。
您
\n
在 Windows 上应该使用 Unix 换行符 ()\r\n
。差异在这里得到了很好的解释:
要自己测试,只需更改以下几行:
对此:
如果希望跨平台与换行符保持一致,我建议您只需根据 OS/shell 版本将一个常量应用于您的代码,该常量将分配正确的换行符,然后将其分配给
\n
您代码中的所有位置.