sleep()函数在Ubuntu 20.04+WSL1不起作用

今天在写程序的时候需要使用sleep函数,但是每次调用都不能将程序休眠,查阅资料可知:

在WSL1中的Ubuntu 20.04对于sleep()函数不能正确调用

文章链接:https://blog.csdn.net/sinat_27953939/article/details/106473347?fps=1&locationNum=2

因此,要解决这个问题,就需要微软来做了,但是正如文章所说,这个问题短期内估计不行了。

解决方法是,将WSL1更新到WSL2,这就需要开启Hyper-V,因此会导致大多安卓模拟器不能运行。

(如何从WSL1更新到WSL2:https://docs.microsoft.com/zh-cn/windows/wsl/install-win10

因为我只要在程序中进行倒计时,我的解决方法是使用这个函数来代替sleep的功能(这个方法不好!!!)

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <time.h>
void timeoclock(int second)
{
    //     for (int i = second; i > 0; i--)
    //     {
    //         printf("%d \n", i);
    //         sleep(1);
    //     }
    time_t start;
    start = time(NULL);
    while (1)
    {
        if (time(NULL) - start == second)
            break;
    }
}
View Code

 

查阅资料,我认为这个替代方法很好

下面给上链接https://blog.csdn.net/wenqiang1208/article/details/71054707

这个是原作者的代码

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<signal.h>

void hander(int sig)
{}

//解决竞态问题
int mysleep(int seconds)
{
    struct sigaction act,oldact;
    sigset_t mask,omask,susmask;
    act.sa_handler = hander;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    sigaction(SIGALRM,&act,&oldact);
    sigemptyset(&mask);
    sigaddset(&mask,SIGALRM);
    sigprocmask(SIG_BLOCK,&mask,&omask);

    alarm(seconds);
    susmask = omask;
    sigdelset(&susmask,SIGALRM);
    sigsuspend(&susmask);

    int _time = alarm(0);
    sigaction(SIGALRM,&oldact,NULL);
    sigprocmask(SIG_SETMASK,&omask,NULL);
    return _time;
}

int main()
{
    while(1)
    {
        mysleep(5);
        printf("I am sleeping....\n");
    }

    return 0;
}

 

posted @ 2020-06-07 11:47  Rogunt  阅读(1042)  评论(0编辑  收藏  举报