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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM