带睡眠的简单 C 代码在执行后没有输出

Simple c code with sleep gives no output after execution

我写了下面这段代码来模拟回调。但这卡住了,甚至没有打印 "inside main"。我在我的 unix 机器和在线编译器上试过这个,但行为相同。我错过了什么吗?

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

void sleep_50sec()
{
    printf("inside sleep_50sec");

    sleep(50);

}

int main()
{
    int i;
    printf("inside main");
    sleep(1);

    for( i =0; i < 100;i++)
    {   printf("Loop %d",i);
        sleep_50sec();
    }
return 0;
}

输出

root@xyz> ./a.out

打印到stdout时添加\n

printf("inside main\n");

需要 \n 的原因是 printf 在达到 \n 后将数据刷新到 stdout

您可以打印到 stderr 以立即查看您的数据,而无需使用 \n:

fprintf(stderr, "test");

顺便说一下,当调用 printf() 时,输出将写入 stdout。所以 printf(...)fprintf(stdout, ...)

相同

您看不到任何打印的原因是 crt(C 运行时)缓冲您的输出,并且仅在累积 K 个字符后才会输出到屏幕。一种解决方案是使用 '\n' - 这提示 crt 已经写入了完整的一行,并且 应该 将其打印到屏幕上。另一种解决方案是隐式刷新 stdout 就像我下面的例子:

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

void sleep_50sec()
{
    printf("inside sleep_50sec");
    fflush(stdout);

    sleep(50);

}

int main()
{
    int i;
    printf("inside main");
    fflush(stdout);
    sleep(1);

    for( i =0; i < 100;i++)
    {   printf("Loop %d",i);
        fflush(stdout);
        sleep_50sec();
    }
return 0;
}

您必须冲洗stdout。它可以通过格式字符串中的 '\n' 字符或通过 fflush 命令来完成:

void sleep_50sec() {
    printf("inside sleep_50sec");
    fflush(stdout);
    sleep(50);
}