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; } }
查阅资料,我认为这个替代方法很好
下面给上链接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; }