WSL Linux / proc / task / childrenは存在しません

1
2022.01.14

Windows10でWSLUbuntuを実行しています。次のタスクがあります。

  • C ++で小さなプロセスツリーを構築するアプリを作成します(完了)
  • pstreeコマンド(行われて木を見て、すべてのプロセスは、getchar()によって停止、実行されています
  • そして、/procに含まれているフォルダtask//childrenを何見。

問題は、ここにchildrenディレクトリのようなものがないことです。 PIDでディレクトリにcdし、タスクディレクトリを開きます。同じPIDで他に何もない別のディレクトリが表示されます。このディレクトリを開くと、 childrenファイルも表示されません。

私は何が間違っているのですか?

編集/更新:これはデフォルトで無効になっているように見えるCONFIG_PROC_CHILDRENによって構成されていることがわかりました。では、どうすればこれを有効にできますか?

回答
1
2022.01.14

私の推測では、WSL1を使用していると思います。でもまず ...

このディレクトリを開くと、「子」ディレクトリも表示されません

私のシステムでは、 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にマップに直接相当するものがないか、WSLチームがそのニュアンスを実装しないことを選択しました。

一方、WSL2は実際のLinuxカーネル( Githubリポジトリ)を使用します。私はあなたが彼らの.configでほとんどWSL2のすべてのバージョンが持っていたカーネルCONFIG_PROC_CHILDREN=y以降WSL1上にあることを推測しています。確認できる最も古いWSL2カーネル構成設定へのリンクは次のとおりです。

あなたが試みているカーネル/プロセス検査のタイプを実際に行うには、WSL2を使用する必要があります。 WSL1は多くのタスクに最適ですが、WSL2に「実際の」カーネルを追加すると、WSL1の「変換」メカニズムに見られる可能性のある多くの不整合が解消されます。

WSL2をインストールして構成している場合は、次のコマンドを使用してインスタンスを変換できます(ここでも、PowerShellまたはCMDから)。

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