最近在協助同事安裝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