最近在协助同事安装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