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没有问题,现在程序可以工作了!