我正在使用适用于 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);
}
}
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 版本和状态一起使用的所有发行版。要切换 WSL 版本,请运行
您可能需要先安装内核。您可以参考更新到 WSL 2-Microsoft Docs。
更轻松的一点是,
sleep()
需要以毫秒为单位的时间作为参数,而 1 毫秒则很少被注意到。我建议尝试至少 15000 毫秒,即 15 秒。相关主题:
WSL 系统调用 - Microsoft Docs
适用于 Linux 的 Windows 子系统概述 - Microsoft Docs
WSL 2 有什么新功能?-微软文档
比较 WSL 1 和 WSL 2 - Microsoft Docs
什么是适用于 Linux 的 Windows 子系统(WSL 和 WSL2)?— Windows 中的 Linux - FOSSBYTES