Sleep()函數失效的問題(WSL)

      最近在協助同事安裝windows10 的Ubuntu子系統後,寫代碼時發現其調用sleep函數無效(現象是調用sleep直接返回,沒有阻塞效果)。

查詢github WSL issues:  https://github.com/microsoft/WSL/issues/4898

有人提出將glibc從2.30.3升級到2.31.1的更新之後,sleep命令停止工作,拋出錯誤:sleep:無法讀取實時時鐘:無效參數,導致sleep無法正常使用。

通過如下命令,查看本機glibc版本:

ldd --version

 再查了查ubuntu版本:


果不其然,原來是裝的windows10 Ubuntu 子系統是20.04版本,其glibc版本較新導致的。 
根本原因是glibc 2.31.x 中的一個補丁,該補丁以更類似於UNIX的方式實現了基於CLOCK_REALTIME的nanosleep()庫調用 。而在NT內核上模擬UNIX系統時鐘非常棘手,修復這個問題需要不少時間。
官方建議是回退使用 Ubuntu 18.04版本。

當然,除了裝回18.04版本,也可升級使用WSL2

解決方法參考:https://docs.microsoft.com/zh-cn/windows/wsl/install-win10#update-to-wsl-2

安裝WSL2的前提是得將win10更新到   版本2004(OS 內部版本 19041 或更高版本),如果已經是了,可直接按如下步驟進行操作:

操作步驟如下:

1. 管理員權限打開powershell,進行如下操作:

2. 下載Linux內核更新包

3.一路下一步,安裝即可

4.啓用虛擬機平臺功能

 

5.將Ubuntu設置爲受 WSL2 版本支持。

重新開啓ubuntu,輸入如下指令查看版本爲2說明切換成功了: 

 

此外,如果要使 WSL 2 成爲你的默認體系結構,可以通過此命令執行該操作: 

wsl --set-default-version 2

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章