【问题标题】:what does sleep do by default? does it goes for sleep for actual timing [duplicate]sleep 默认情况下做什么?实际时间是否会进入睡眠状态[重复]
【发布时间】:2013-07-25 13:44:28
【问题描述】:

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

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

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

【问题讨论】:

标签: c unix


【解决方案1】:

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

fflush(stdout);
sleep(1);

【讨论】:

  • 还有 setbuf(stdout,NULL);fpurge ,不过 fpurge 是非标准的 :)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    printf 在幕后是一个昂贵的电话。如果您打印了半行,则输出会被缓冲,以期添加更多文本,以便通过单个系统调用显示所有内容。

    【讨论】:

      【解决方案4】:

      您可以通过使用cout 并设置unitbuf 标志来避免缓冲区问题。 see example

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

      【讨论】:

      • 问题是关于 C 的,cout 是 C++
      • sleep() 函数需要秒数,而不是毫秒。睡眠(至少在 Windows 上)需要几毫秒。我什至不知道是C++/C还是unix/Windows还是Everything/VC++,一个是小写,一个是大写。
      【解决方案5】:

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

      但是,终端的输出流默认是line buffer

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

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

      【讨论】:

        【解决方案6】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2011-09-05
          • 1970-01-01
          • 2017-03-08
          • 2011-09-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多