今天在寫程序的時候需要使用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; }
