C睡眠功能不起作用

时间:2012-11-26 15:54:32

标签: c sleep unistd.h

当从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)被注释掉时,其余的都运行正常吗?

3 个答案:

答案 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的计算机上,代码看起来很好。