13

当从程序中包含睡眠功能时,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)被注释掉时运行良好,有什么想法吗?

4

4 回答 4

17

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

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

于 2012-11-26T15:57:32.530 回答
6

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)将执行此操作。

于 2012-11-26T16:07:36.490 回答
0

你是在 Windows 电脑上吗?如果是这样,包括<windows.h>在你的程序中,并暂停程序,写

Sleep(time_in_milliseconds)

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

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

于 2012-11-26T16:03:37.773 回答
-1

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

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

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

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

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

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

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

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

于 2022-02-15T22:47:51.727 回答