我在 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