C 中的 sleep() 函数在 Ubuntu 20.04 (WSL) 上不起作用。有什么方法可以让 sleep() 工作吗?

C 中的 sleep() 函数在 Ubuntu 20.04 (WSL) 上不起作用。有什么方法可以让 sleep() 工作吗?

我正在使用适用于 Ubuntu 的 Windows 应用程序来练习 C/C++ 代码。

最后我发现这个sleep()调用在这里不起作用。我查看了之前在其他帖子中提供的答案,但没有找到任何相关的解决方案。

所以我只是想知道是否有任何方法可以使sleep()或类似的等待调用在同一个 Ubuntu 应用程序上运行?

示例代码:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>

void handler(int num)
{
        write(STDOUT_FILENO, "I am in handler...handling signal\n", 13);
}

int main(int argc, char **argv)
{
        signal(SIGINT, handler);
        signal(SIGTERM,handler);

        while(1)
        {
                printf("Just wasting your time! PID = %d\n", getpid());
                sleep(1);
        }

}

答案1

sleep()是一个系统调用。在 WSL 1 中,指令如下已翻译并由 Windows NT 内核进一步处理,因为 WSL 1 不包含真实的Linux 内核。另一方面,WSL 2 由真实的Linux内核是微软根据Linux内核的源代码构建的,并以此来处理系统调用。

供您参考,这是 WSL 1 架构的概述:

WSL 1 体系结构WSL 1 architecture

以下是 WSL 2 架构的概述:

WSL 2 体系结构WSL 2 architecture
图片来源什么是适用于 Linux 的 Windows 子系统 (WSL 和 WSL2)? — Windows 中的 Linux - FOSSBYTES

因此,无法保证所有特定于 Linux 内核的系统调用都将被 Windows NT 内核翻译并理解。

为了sleep()工作,你需要使用真实的Linux 内核,即 WSL 2。要查看当前正在使用的 WSL 版本,请打开命令提示符或 Powershell 并运行

wsl -l -v

这将列出你当前正在使用的所有发行版以及 WSL 版本和状态。要切换 WSL 版本,请运行

wsl --set-version distributionName WSLversion # eg:  wsl --set-version ubuntu-20.04 2 

您可能需要安装内核首先。你可以参考更新至 WSL 2 - Microsoft Docs


简单来说,sleep()以毫秒为单位的时间作为参数,1 毫秒非常短,很难被注意到。我建议至少尝试 15000 毫秒,即 15 秒。


相关主题:

相关内容