我正在使用适用于 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 2 架构的概述:
图片来源:什么是适用于 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 秒。