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。
还运行此代码:
#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 中正确打印代码。
对于 Cygwin 来说,有一个明显的竞争条件,它输出形成行主体的字符,然后输出行结束符 ( CRLF),并且另一个进程能够介于两者之间,因此您实际上得到了body1 body2 CRLF CRLF(为了清楚起见,添加了间距)。
标准 C 禁止标准输出到“交互式设备”进行完全缓冲(即多于一行),但允许较少的缓冲,以及在任何情况下操作系统(C 正式称为“主机环境”)如何处理来自多个进程的输出一旦“传输”到它就完全超出了 C \xe2\x80\x94 的范围,甚至在这种情况下 POSIX 如果我\xe2\x80\x99m 没有误认为 \xe2\x80\x94 不是 Cygwin 可以完全满足 POSIX 无论如何。
\n| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |