C - sleep() 函数不起作用,打印立即执行


static void timeDelay(int no_of_seconds)
{
#ifdef _WIN32
Sleep(1000 * no_of_seconds);
#else
sleep(no_of_seconds);
#endif
}
void somefunction(){
printf("tt Load ... ntt"); 
fflush(stdout); 
for (int i = 1; i <= 60; i++)
{
fflush(stdout);
timeDelay(1);
if (i == 31)
printf("ntt");
printf("*****");
}

}

我也包含了头文件:

#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>

星星是瞬间打印的。 看到这里的答案后,我添加了fflush(stdout)。我还注释掉了if (i==31) {}部分,以检查这是否导致了问题,但事实并非如此。那么我的代码有什么问题呢?

根据sleep()手册页...

笔记 在 Linux 上,sleep(( 是通过 nanosleep(2( 实现的。 参见 nanosleep(2( 手册页,了解 使用的时钟。

所以我重写了你的程序来使用nanosleep。当您使用 WSL 时,我已经删除了对 Win32 的任何引用,只有 Linux。好吧,问题是这个程序过早地退出nanosleep((,并出现"无效参数"错误。我不明白为什么会这样。

#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>
void timeDelay (time_t no_of_seconds)
{
struct timespec req, rem;
int res;
req.tv_sec = no_of_seconds;
req.tv_nsec = 0;
do
{
rem.tv_sec = 0;
rem.tv_nsec = 0;
res = nanosleep (&req, &rem);
req = rem;
}
while (res == EINTR);
if (res)
perror("nanosleep");
}
void somefunction()
{
printf("tt Load ... ntt");
fflush(stdout);
for (int i = 1; i <= 60; i++)
{
fflush(stdout);
timeDelay(1);
putchar('*');
}
}
int main()
{
somefunction();
return 0;
}

我还尝试使用NULL而不是rem,并使用原始时间而不是剩余时间重新发布nanosleep(),并将测试和 perror(( 放在循环中以打印来自 nanosleep 的所有可能错误。无论我做什么,我总是从第一个电话到nanosleep()收到EINVAL

因此,WSL 上的nanosleep()似乎存在一个真正的问题。请参阅 https://github.com/microsoft/WSL/issues/4898 。它提到了 WSL 无法从某个版本的 glibc 读取实时时钟的问题。我在 WSL 终端中尝试了这个:

$ sleep 1
sleep: cannot read realtime clock: Invalid argument

这里提到了一种解决方法: https://github.com/microsoft/WSL/issues/4898#issuecomment-612622828

我尝试了另一种方法:使用clock_nanosleep()这样我就可以为时钟选择另一个来源:在上面的程序中,只需将调用更改为nanosleep()与此另一个clock_nanosleep()

clock_nanosleep (CLOCK_MONOTONIC, 0, &req, &rem);

CLOCK_MONOTONIC没有问题,现在程序可以工作了!

最新更新