睡眠默认是做什么的?是否适合实际时间睡觉

时间:2013-07-25 13:44:28

标签: c unix

嗨我以下是1的简单代码,但是当我执行它时,首先它应该打印printf中的第一行然后睡眠1秒然后打印第二行它应该继续做但是这里我终于没有得到任何东西,几秒钟后突然一切都打印出来,然后再回去睡觉。究竟发生了什么我不理解。

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

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

6 个答案:

答案 0 :(得分:2)

printf更常见的是输出函数被缓冲。如果要查看预期的行为,则应在进入睡眠状态之前刷新输出。

fflush(stdout);
sleep(1);

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

printf在幕后是一个昂贵的电话。如果您打印了半行,则输出会被缓冲,希望可以附加更多文本,这样就可以通过一次系统调用显示所有文本。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

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

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

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

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

答案 5 :(得分:0)

正如其他所有人都指出你正在经历一个潮红问题,而不是睡眠问题。 printf是缓冲的,也许在你的环境中,当字符串包含“\ n”时它不会被缓冲,但我认为这只是你的环境。

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

所以,做其他人则建议以清除缓存的东西,无论是fflush(标准输出)(后您的情况下,每个printf的),或则setbuf(标准输出,NULL)(这通常是任何的printf前完成),或只是简单的改变你的printf到fprintf(stderr,“睡前你好”); (stderr没有得到缓冲)

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