当从unistd.h
包含睡眠功能时,程序会无限期挂起:
#include <stdio.h>
#include <unistd.h>
int main()
{
int i;
printf("0 ");
for(i = 1; i <20; ++i)
{
sleep(2);
printf("%d ", i);
}
printf("\n");
return 0;
}
当sleep(2)
被注释掉时,其余的都运行正常吗?
答案 0 :(得分:9)
代码没有任何问题,但请注意,在许多情况下,printf
的输出被缓冲,这意味着仅当您明确调用fflush(stdout)
时,输出才显示在控制台上,您打印换行符,或缓冲区变满。由于直到最后才打印换行符,因此在for循环中看不到任何内容,持续40秒(因为printf
打印的内容仍在缓冲区中)。然后,当执行命中printf("\n")
时,刷新缓冲区时将立即打印所有内容。
所以,最重要的是:在调用fflush(stdout)
之前调用sleep
以确保没有任何内容留在输出缓冲区中,或者等待40秒,您将在一个批处理中获得输出最后。
答案 1 :(得分:3)
hangs indefinitely
意味着它是卡住的或非确定的,并且这种情况不会发生。您的代码工作正常,在38秒(19 * 2)之后,它会转储从0到19的字符串。但是我怀疑这是您正在寻找的事情:
int main()
{
int i;
printf("0 ");
fflush(stdout); // Force the output to be printed
for(i = 1; i <20; ++i)
{
sleep(2);
printf("%d ", i);
fflush(stdout); // Force the output to be printed
}
printf("\n");
return 0;
}
stdout
流已缓存,只有在遇到换行符'\n'
时才会显示,或者如果您希望“实时”查看它,则需要调用printf()
强迫它以某种方式冲洗缓冲区。致电fflush(stdout)
即可。
答案 2 :(得分:0)
你在Windows电脑上吗?如果是这样,请在程序中包含,并暂停程序,写下
Sleep(time_in_milliseconds)
在你的情况下,time_in_milliseconds应为2000.
另一方面,如果你在基于UNIX的计算机上,代码看起来很好。