1

嗨,我下面是一个带有 while 1 的简单代码,但是当我执行它时,首先它应该在 printf 中打印第一行,然后休眠 1 秒,然后打印第二行,它应该继续这样做,但我不这样做'在终端中没有得到任何东西,几秒钟后突然所有东西都被打印出来,然后又回到睡眠状态。到底发生了什么我不明白。

int main(void)
{
  while(1)
 {
    printf("hello before sleep");
    sleep(1);
    printf("hello after sleep");
  }
}

但是在上面的相同代码中,如果我在 printf 中的每一行之后使用 \n 它可以正常工作,就像我预期的那样。为什么会这样?

4

6 回答 6

2

printf更一般地说,输出函数是缓冲的。如果你想看到预期的行为,你应该在睡觉前刷新输出。

fflush(stdout);
sleep(1);
于 2013-07-25T13:46:43.103 回答
2

printf 仅在遇到换行符或输出缓冲区已满时才会刷新。因此,要控制实际显示输出的确切时间,您可以在输出中添加换行符,或者强制刷新以确保将待处理的输出实际发送到终端:

int main(void)
{
  while(1)
 {
    printf("hello before sleep");
    fflush(stdout);
    sleep(1);
    printf("hello after sleep");
    fflush(stdout);      }
}
于 2013-07-25T13:47:04.387 回答
1

printf在幕后是一个昂贵的电话。如果你已经打印了半行,输出会被缓冲,希望添加更多的文本,这样它就可以通过一个系统调用显示出来。

于 2013-07-25T13:47:04.803 回答
0

实际上。你的代码是对的。

但是,终端的输出流默认是行缓冲区

因此,如果您使用 '\n' 或调用 fflush(),它会在您调用 printf 后立即刷新缓冲区并打印单词。

如果你不这样做,你输出的单词“睡眠前的你好”和“睡眠后的你好”都存储在缓冲区中,当程序结束时,它会调用退出函数,关闭进程并刷新缓冲区,打印单词。

于 2013-07-25T14:07:22.157 回答
0

cout您可以通过使用和设置unitbuf标志来避免缓冲区问题。看例子

此外,该sleep()函数以毫秒为单位停止执行。如果您想暂停执行一秒钟,则传递的参数将为 1000,如sleep(1000);

于 2013-07-25T13:56:20.880 回答
0

正如其他人指出的那样,您遇到的是潮红问题,而不是睡眠问题。printf 是缓冲的,也许在你的环境中,当字符串包含“\n”时它没有缓冲,但我认为这只是你的环境。

我相信,当你没有“\n”时你认为它“再次”进入睡眠的原因是因为没有“\n”,最后一行看起来不正常,因为它没有“\ n”,因此您的环境可能会以某种奇怪的方式打印提示 - 比如在“睡眠后你好”之后。

所以做其他人建议清除缓冲的事情,或者 fflush(stdout) (在你的情况下每个 printf 之后),或者 setbuf(stdout, NULL) (这通常在任何 printf 之前完成),或者只是将你的 printf 更改为 fprintf( stderr, "睡前你好"); (stderr 没有被缓冲)

最后一点:您也可以在调试器中停止并观察行为。在初始“printf”之后,您可能会或可能不会在屏幕上看到 printf 的输出,但是当您执行“睡眠”时,调试器应该挂起一秒钟。

于 2013-07-25T14:38:06.877 回答