
WSL C# API 中的 Signal 枚举从 WinRT 接口到底层 Linux 信号传递的完整解析【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL导读Signal枚举是 Microsoft.WSL.ContainersWSLCC#/WinRT 编程接口中用于表示 Linux 进程信号的类型它在停止容器Container.Stop、向容器内进程发送信号Process.Signal以及解析进程崩溃信息ProcessCrashInformation.Signal等场景中承担着关键角色。本文以 signal.md 为骨架结合 WSL 仓库中的 IDL 定义、原生 C ABI 映射、容器会话层实现与 CLI 测试用例完整讲解每个枚举成员的含义、取值约束、底层调用链与使用注意事项帮助你正确地在托管代码中控制 WSL 容器与进程的生命周期。Signal 枚举定义与成员语义Signal枚举定义于 wslcsdk.idl通过 C#/WinRT 投影为托管枚举完整定义如下public enum Signal { None 0, SIGHUP 1, SIGINT 2, SIGQUIT 3, SIGKILL 9, SIGTERM 15 }该枚举的数值直接对应 POSIX/Linux 的标准信号编号各成员在 IDL 源注释中的定位如下成员数值IDL 注释定位Linux 语义None0No signal; reserved for future use无信号为后续扩展保留不应作为实际发送目标SIGHUP1reload / hangup终端挂断或控制进程退出守护进程通常用它触发配置重载SIGINT2interrupt (Ctrl-C)键盘中断即终端按下 Ctrl-C 产生的信号SIGQUIT3quit with core dump退出并生成核心转储core dumpSIGKILL9immediate termination强制立即终止进程无法捕获、阻塞或忽略SIGTERM15graceful shutdown优雅终止进程可以捕获后自行清理并退出依据以上成员含义与注释直接来自 wslcsdk.idl。当前枚举仅覆盖这 6 个常用信号原生头文件中明确标注 Will define more signals as neededwslcsdk.h即未来可按需扩展使用时应以当前仓库版本为准。Signal 在 WinRT API 中的三个典型使用场景1. 停止容器Container.Stop// 原型来自 wslcsdk.idl void Stop(Signal signal, Windows.Foundation.TimeSpan timeout);调用Stop时指定信号决定容器内的 init 进程以何种方式被终止timeout决定等待其退出优雅的最长时间。实现位于 Container.cpp先把TimeSpan换算为秒duration_castseconds对超时做两层校验超过uint32_t上限抛hresult_invalid_argument(Timeout is too large)为负值抛hresult_invalid_argument(Timeout must be non-negative)最终将枚举强转为其原生 ABI 等价类型WslcSignal调用WslcStopContainer(container, signal, timeoutSeconds, errorMessage)。这意味着传SIGTERM并给出合理超时可实现“先优雅停机、超时后由底层兜底强杀”的标准容器停止流程而直接传SIGKILL则会立即强制终止。2. 向进程发送信号Process.Signal// 原型来自 wslcsdk.idl void Signal(Signal signal);用于向已启动的容器进程发送任意支持的信号实现位于 Process.cppvoid Process::Signal(winrt::Microsoft::WSL::Containers::Signal const signal) { winrt::check_hresult(WslcSignalProcess(ToHandle(), static_castWslcSignal(signal))); }典型用途包括向服务进程发送SIGHUP触发配置热重载、发送SIGINT模拟 Ctrl-C 中断、发送SIGTERM请求优雅退出或发送SIGKILL强制清理异常进程。3. 读取崩溃信号ProcessCrashInformation.Signal当进程因信号终止时ProcessCrashHandler事件会携带 ProcessCrashInformation 对象其Signal属性UInt32见 wslcsdk.idl返回导致崩溃的信号编号如11对应 SIGSEGV。该值并非Signal枚举类型而是原始数字因此请勿用本枚举做直接强转应将其作为诊断信息读取实现见 ProcessCrashInformation.cpp。底层映射从 C# 枚举到原生 WslcSignal托管枚举并非凭空而来它严格对齐了 WinRT 层的 C 原生枚举与 C ABI 层的 C 枚举。在 wslcsdk.h 中C 接口定义了与之逐值对应的WslcSignaltypedef enum WslcSignal { WSLC_SIGNAL_NONE 0, // No signal; reserved for future use WSLC_SIGNAL_SIGHUP 1, // SIGHUP: reload / hangup WSLC_SIGNAL_SIGINT 2, // SIGINT: interrupt (Ctrl-C) WSLC_SIGNAL_SIGQUIT 3, // SIGQUIT: quit with core dump WSLC_SIGNAL_SIGKILL 9, // SIGKILL: immediate termination WSLC_SIGNAL_SIGTERM 15, // SIGTERM: graceful shutdown } WslcSignal;调用链清晰可见C# 枚举 → WinRT 枚举winrt::Microsoft::WSL::Containers::Signal→static_cast到 C ABI 枚举WslcSignal→ 进入 SDK 导出函数wslcsdk.def→ 由容器会话层最终传递给 Linux 侧进程。由于两层枚举数值完全一致跨边界转换只是类型层面的重新解释不会发生数值漂移。在容器会话层的网络路径中该信号值还会被直接序列化为 Docker Engine API 的signal查询参数见 DockerHTTPClient.cppStopContainer与SignalContainer都会把WSLCSignal强转为整型后拼入/containers/{id}/stop与/containers/{id}/kill请求。这说明同一个信号语义在原生 SDK、Docker 兼容协议两条通道上保持一致。CLI 层的信号解析字符串与枚举互转除编程 API 外WSLC 的命令行工具同样支持以字符串指定信号其解析逻辑与Signal枚举的取值一一对应并由单元测试锁定行为。在 WSLCCLIArgumentUnitTests.cpp 中可看到以下规则支持SIGTERM、SIGKILL、SIGHUP等带SIG前缀的形式支持省略前缀的TERM、HUP、KILL匹配大小写不敏感sIgTerm、term均合法支持数字形式如15解析为 SIGTERM越界值如999与未知名称如INVALID_SIGNAL会抛出ArgumentException。测试还验证了Signal与StopSignal两个参数共用同一转换器WSLCCLIArgumentUnitTests.cpp并支持一次解析多个信号值后按序缓存WSLCCLIArgumentUnitTests.cpp。使用建议与注意事项停止容器优先使用 SIGTERM 超时Container.Stop携带超时参数允许容器优雅关闭SIGKILL应仅用于无响应场景因其不可被捕获会跳过所有清理逻辑。区分三种用途的类型差异Container.Stop与Process.Signal接收Signal枚举ProcessCrashInformation.Signal返回原始UInt32信号编号仅作诊断不要误当作枚举使用。None仅为占位IDL 注释明确其为 reserved for future use不建议作为实际发送信号需要“不指定信号”的语义时在 CLI 层选择省略对应参数而不是显式传None。超时参数有边界约束Container.Stop的TimeSpan会换算为秒并校验非负且不超过uint32_t上限超大或负值会直接抛异常见 Container.cpp。枚举扩展遵循 ABI 对齐新增信号时需同时更新 IDL 枚举与 C ABI 枚举并保持数值一致托管层与原生层才能继续安全互转。延伸阅读Signal 枚举参考页本文主体其他枚举参考如ProcessState、ContainerState、DeleteContainerOption等配套类型Container 核心类 与 Process 核心类枚举的实际消费方ProcessCrashInformation 数据类崩溃信号读取原生定义wslcsdk.idl、wslcsdk.h会话层 Docker 协议映射DockerHTTPClient.cppCLI 信号解析测试WSLCCLIArgumentUnitTests.cpp【免费下载链接】WSLWindows Subsystem for Linux项目地址: https://gitcode.com/GitHub_Trending/ws/WSL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考