WSL Linux /proc/task/children 不存在

WSL Linux /proc/task/children 不存在

我在 Windows 10 上运行 WSL Ubuntu。我有一项任务:

  • 用 C++ 创建一个构建小型进程树的应用程序(已完成)
  • 通过 pstree 监视树(完成,所有进程都在运行,被停止getchar()
  • task//children并观察文件夹中包含什么/proc

问题是这里没有children目录。我cd按 PID 进入目录并打开任务目录。在那里我看到另一个具有相同 PID 的目录,没有其他内容。当我打开此目录时,我children也没有看到任何文件。

我究竟做错了什么?

编辑/更新:我发现这个配置CONFIG_PROC_CHILDREN似乎默认是禁用的。那么我该如何启用它呢?

答案1

我猜你正在使用 WSL1。但首先...

当我打开此目录时,我也没有看到“children”目录

在我的系统上,children是文件,而不是目录。只是为了确保您正在寻找正确类型的项目,但我猜即使它是文件而不是目录,您也会发现它 :-)。

$ cat /proc/1/task/1/children
9 10

但正如我所说,我根据您的 WSL 版本进行猜测。通过(从 PowerShell 或 CMD)确认 WSL 版本(1 或 2):

wsl -l -v

如果是 WSL1(正如我所怀疑的那样),那么它将不支持CONFIG_PROC_CHILDREN。WSL1 不使用真正的 Linux 内核,而是使用“转换”层将 Linux 内核的系统调用转换为 Windows 内核的系统调用。要么是 Windows 中没有与 map 直接等效的功能,要么是 WSL 团队选择不实现这种细微差别。

另一方面,WSL2 确实使用了真正的 Linux 内核(Github 仓库)。我猜你使用的是 WSL1,因为几乎所有版本的 WSL2 内核都有CONFIG_PROC_CHILDREN=y.config以下是最旧的 WSL2 内核配置设置您可以在此处确认。

要真正进行您正在尝试的内核/进程检查类型,您需要使用 WSL2。WSL1 非常适合执行许多任务,但在 WSL2 中添加“真实”内核将消除您可能在 WSL1“翻译”机制中发现的许多不一致之处。

如果您已经安装并配置了 WSL2,则可以使用以下命令转换实例(再次使用 PowerShell 或 CMD):

wsl --export <distroname> backup.tar
wsl --set-version <distroname> 2

相关内容