为什么此C程序无法打印任何内容?

时间:2018-12-18 07:27:04

标签: c linux stdout flush

我有以下代码:

int main()
{
   printf("hello world");
   while(1);
}

应该打个招呼世界。如果是,为什么?如果没有,为什么? 我在Linux机器上使用gcc来编译代码。

2 个答案:

答案 0 :(得分:6)

我们不知道。

标准输出缓冲区可能已刷新,但也可能未刷新。

换句话说,当执行printf("hello world");时,“ hello world”将存储在标准输出缓冲区中。

然后,由于while(1);,我们将陷入无限循环。

那时,我们无法确定是否将刷新标准输出缓冲区。例如,在此 Live demo 中,它不是,这是最有可能发生的事情,但通常不能保证。

通常,我会添加一个换行符,以确保打印该消息。在Why does printf not flush after the call unless a newline is in the format string?

中了解更多信息

另一种方式是这样的:

#include <stdio.h>
int main(){
  printf("hello world");
  fflush(stdout);
  while(1);
}

将迫使标准输出缓冲区自行清空并将存储在其中的所有内容定向到标准输出(通常是屏幕)。

正如@hyde所说,例如,可以通过gdb为您刷新缓冲区来激发这种行为。在How to unbuffer stdout of legacy running binary without stdbuf and similar tools中了解更多信息。


这可能是一个假设的场景,但是要吸取的教训是,在调试过程中,许多人使用printf()来查明程序崩溃的位置。

不刷新输出缓冲区可能会导致错误的假设,因为程序员可能会认为程序在此printf("here");之前崩溃了,但是由于上述原因,情况可能并非如此。

换句话说,可能会在标准输出(例如屏幕)中未打印“这里”,但这并不意味着我们的程序没有达到printf()。 / p>

答案 1 :(得分:2)

在正常情况下,消息不会被打印-至少在大多数类Unix平台上都不会打印。当标准输出是“交互式设备”(“终端”的标准术语)时,默认的输出缓冲是(通常)行缓冲。由于尚未打印换行符,因此没有要刷新的行,因此输出保留在程序的缓冲区中。当您中断它时,不会刷新输出。

仅当您将输出设置为“ no buffering”时,才可以看到输出,或者在进入循环之前进行了明确的public class User { public string UserID; public string Name; public string Badge; public string Status; public string isAdmin; } fflush(stdout)的操作,或者您做了明智的选择并添加换成换行,该字符串首先打印出来。

fflush(0)

(全缓冲,例如将输出通过管道传输到另一个程序时,几乎可以保证您也不会看到输出。)