【问题标题】:Simple c code with sleep gives no output after execution [duplicate]带有睡眠的简单c代码在执行后没有输出[重复]
【发布时间】:2017-06-13 15:05:14
【问题描述】:

我编写了以下代码来模拟回调。但这被卡住了,甚至没有打印“内部主要”。我在我的 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

【问题讨论】:

  • 执行完成还是挂起?
  • printf 在看到换行符 \n 时刷新为 stdout。将其附加到您的 printf 调用中,您应该会看到一些打印输出。
  • @yano 假设你没有继承 stdout 设置为 _IOFBF

标签: c sleep


【解决方案1】:

打印到stdout时添加\n

printf("inside main\n");

之所以需要\n,是因为在达到\n 之后,printf 会将数据刷新到stdout

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

fprintf(stderr, "test");

顺便说一句,当调用printf() 时,输出将被写入stdout。所以printf(...)fprintf(stdout, ...)是一样的

【讨论】:

  • 加上一些的解释,这可能是一个很好的答案。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    您没有看到任何打印的原因是因为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;
    }
    

    【讨论】:

    • 控制缓冲的是你的 C 运行时。
    • @FelixPalmen 正确,已修复
    • @IshayPeled 你如何“冲洗”CRT?我认为您的意思是stdout,这是显式刷新而不是隐式刷新。
    • @AjayBrahmakshatriya 当然你是对的(:更正
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    相关资源
    最近更新 更多