【问题标题】:C sleep function not workingC 睡眠功能不工作
【发布时间】:2012-11-26 15:54:32
【问题描述】:

当包含来自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) 被注释掉时,其余运行正常,有什么想法吗?

【问题讨论】:

标签: c sleep unistd.h


【解决方案1】:

代码没有问题,但请注意,在许多情况下,printf 的输出是缓冲的,这意味着只有当您显式调用 fflush(stdout)、打印换行符或缓冲区时,输出才会出现在控制台上变满。由于您直到最后才打印换行符,因此您将在 40 秒内在 for 循环中看不到任何内容(因为 printf 打印的内容仍在缓冲区中)。然后,当执行到printf("\n") 时,所有内容都会在缓冲区被刷新时立即打印出来。

因此,底线是:要么在调用 sleep 之前调用 fflush(stdout) 以确保输出缓冲区中没有任何内容,要么等待 40 秒,最终您将获得单个批次的输出。

【讨论】:

    【解决方案2】:

    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) 即可完成此操作。

    【讨论】:

    • @JamesJenkinson - :) 它发生了。调试器对此很好,所以你可以看到它正在做某事,缺少那个,只需等待它可以的最大时间sleep()
    【解决方案3】:

    您使用的是 Windows 计算机吗?如果是这样,在你的程序中包含&lt;windows.h&gt;,并暂停程序,写

    Sleep(time_in_milliseconds)
    

    在你的情况下 time_in_milliseconds 应该是 2000。

    另一方面,如果您使用的是基于 UNIX 的计算机,则代码看起来不错(不需要&lt;windows.h&gt;)。

    【讨论】:

      【解决方案4】:

      我在研究我在 Windows 上遇到的问题时遇到了您的问题。

      我有一个命令行程序,它有 2 个线程,一个用于读取数据,另一个用于写入数据(在队列中)。

      每 30 秒,阅读器(初始进程)会写出一条进度消息并且似乎挂起,所以我按了 Ctrl-C 一次,发现我的程序实际上正在继续(Ctrl-C 一次并没有杀死它) .

      无论如何,在尝试弄清楚发生了什么时,我启动了另一个控制台窗口并运行了命令:

      for /l %g in () do @(dir & timeout /t 2)
      

      每隔一段时间它也会被锁定,而 Ctrl-C 会释放它。

      Windows 中似乎存在某种错误,当系统非常繁忙时,睡眠功能不会返回(Ctrl-C 似乎可以解锁它)。

      无论如何,希望对某人有所帮助。

      【讨论】:

      • Stack Overflow 主要是关于提问和回答问题,因此背景信息不会增加太多内容,同时会造成内容混乱。此外,似乎有两个用户诊断出了问题。打印功能被缓冲,导致控制台中缺少输出。这不是 Windows 中的一个大错误。我建议您在 Stack Overflow 上发布您的情况(简明扼要地使用最少的代码来重现问题),因为可能发生的事情可能与您所描述的不同。如果有人将您的问题诊断为不是 Windows 中的错误,您可能会感到惊喜。
      • 这并不能真正回答问题。如果您有其他问题,可以点击 进行提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      • 2021-10-13
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      相关资源
      最近更新 更多