wsl.exe --terminate 之后进程是否有机会安全终止?

Do processes have a chance to terminate safely after wsl.exe --terminate?

当用户调用 wsl.exe --terminatewslconfig.exe /t 终止 WSL 上的分发时,进程是否有机会安全终止?我还想了解 WSL2 和 WSL1 在这方面是否有任何区别。在 linux 上,我的理解是 shutdown(8) 向所有进程发送 SIGTERM,这让它们有机会保存并干净地退出。通过终止命令在 WSL 中也是这种情况吗?

对于来到这里的任何人,似乎没有关于终止命令在幕后做什么的明确文档,但基于一些小实验,我认为它们不会向进程发送任何信号,并且行为是WSL1 和 WSL2 相同。

这里有一些示例代码来捕获 SIGTERM(可以针对任何信号进行修改)。

#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>

static volatile sig_atomic_t sigterm_flag = 0;

static void sigterm_handler(int _)
{
  (void)_;
  sigterm_flag = 1;
}

int main(void)
{
  signal(SIGTERM, sigterm_handler);

  while (1) {
    if (sigterm_flag) {
      puts("Terminated by SIGTERM");
      break;
    }
    sleep(1);
    puts("Still running...");
  }
  return EXIT_SUCCESS;
}

我编译了它 运行 它。然后我从单独的 powershell 选项卡 运行 wsl.exe --terminatewslconfig.exe /twsl --shutdown 。程序不会捕获任何信号,WSL 实例会直接退出。使用 kill 直接发送信号按预期工作并在退出前打印捕获的信号。

如果有人能阐明您调用 --terminate 时实际发生的情况,那将很有用。另外,感谢 this post 的帮助。