C sleep()函数不起作用,打印是即时执行的 静态无效时间延迟(整数秒) { #ifdef_WIN32 睡眠(1000*不超过10秒); #否则 睡眠(无秒); #恩迪夫 } void函数(){ printf(“\t\t加载…\n\t\t”); fflush(stdout); 对于(inti=1;i
根据C sleep()函数不起作用,打印是即时执行的 静态无效时间延迟(整数秒) { #ifdef_WIN32 睡眠(1000*不超过10秒); #否则 睡眠(无秒); #恩迪夫 } void函数(){ printf(“\t\t加载…\n\t\t”); fflush(stdout); 对于(inti=1;i,c,sleep,windows-subsystem-for-linux,C,Sleep,Windows Subsystem For Linux,根据sleep()manpage 注释 在Linux上,sleep()是通过nanosleep(2)实现的 用过的钟 因此,我重写了您的程序以使用nanosleep。在您使用WSL时,我删除了对Win32的任何引用,仅限Linux。问题是,此程序过早退出nanosleep(),并出现“无效参数”错误。我不明白这是为什么 #ifdef _WIN32 #include <windows.h> #else #include <unistd.h> 这里提到了一个
sleep()
manpage
注释
在Linux上,sleep()是通过nanosleep(2)实现的
用过的钟
因此,我重写了您的程序以使用nanosleep。在您使用WSL时,我删除了对Win32的任何引用,仅限Linux。问题是,此程序过早退出nanosleep(),并出现“无效参数”错误。我不明白这是为什么
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
这里提到了一个解决方法:
我尝试了另一种方法:使用clock\u nanosleep()
,这样我就可以为时钟选择另一个源:在上面的程序中,只需将调用更改为nanosleep()
,将另一个更改为clock\u nanosleep()
时钟单调没有问题,现在程序可以运行了!根据
sleep()
手册页
注释
在Linux上,sleep()是通过nanosleep(2)实现的
用过的钟
因此,我重写了您的程序以使用nanosleep。在您使用WSL时,我删除了对Win32的任何引用,仅限Linux。问题是,此程序过早退出nanosleep(),并出现“无效参数”错误。我不明白这是为什么
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
这里提到了一个解决方法:
我尝试了另一种方法:使用clock\u nanosleep()
,这样我就可以为时钟选择另一个源:在上面的程序中,只需将调用更改为nanosleep()
,将另一个更改为clock\u nanosleep()
时钟的单调性没有问题,现在程序可以运行了!不能复制这个。@n.“代词m.你是什么意思?哪个版本不能按预期工作?@WeatherVane它可以一次打印所有的星星。@Archer好的!是真的!我也一样!不能复制这个。@n.“代词m.你是什么意思?哪个版本不能工作正如预期的那样?@WeatherVane它一次打印所有星星。@Archer好的!这是真的!我也一样!我同意,这并不能解决问题。它甚至没有真正解决问题。如何实现
sleep()
,与此无关。它是否按照文档中的方式运行(如果是这样的话,它没有)这是重点。它的行为确实与我在WSL上记录的一样。这是相关的,因为潜在的问题是sleep()使用nanosleep(),nanosleep()使用时钟实时,这在WSL中无法读取。我已经更新了我的答案。sleep()
在WSL上记录的工作方式(对我来说)。也许在某些WSL提供商上存在缺陷,但这是一个相当非同寻常的说法。WSL的关键点之一是它提供了一个功能齐全的Linux环境。此外,如果某些WSL提供商上确实存在缺陷,这并不一定意味着问题出在nanosleep()
,但这似乎是合理的。对于某些用户来说,它工作得很好。这里也记录了这个问题:很好。这将是实际答案的基础。“sleep()
在某些WSL提供程序上无法正常工作,例如[…]”。为什么它不起作用对于OP的问题来说是一个无关紧要的细节。我同意,这并不能解决问题。它甚至也不能真正解决问题。sleep()
是如何实现的无关紧要。它的行为是否符合文档中的规定(或者如果是这样的话,它没有)这是重点。它的行为确实与我在WSL上记录的一样。这是相关的,因为潜在的问题是sleep()使用nanosleep(),nanosleep()使用时钟实时,这在WSL中无法读取。我已经更新了我的答案。sleep()
在WSL上记录的工作方式(对我来说)。也许在某些WSL提供商上存在缺陷,但这是一个相当非同寻常的说法。WSL的关键点之一是它提供了一个功能齐全的Linux环境。此外,如果某些WSL提供商上确实存在缺陷,这并不一定意味着问题出在nanosleep()
,尽管这似乎是合理的。对于一些用户来说,它工作得很好。这里也记录了这个问题:很好。这将是实际答案的基础。“sleep()
在某些WSL提供商上无法正常工作,例如[…]”。它为什么不能工作,对于OP的问题来说,是一个无关紧要的细节。
#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("\t\t Load ... \n\t\t");
fflush(stdout);
for (int i = 1; i <= 60; i++)
{
fflush(stdout);
timeDelay(1);
putchar('*');
}
}
int main()
{
somefunction();
return 0;
}
$ sleep 1
sleep: cannot read realtime clock: Invalid argument
clock_nanosleep (CLOCK_MONOTONIC, 0, &req, &rem);