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

猜你喜欢

转载自blog.csdn.net/fangye945a/article/details/107161467