如何捕获kill信号,优雅的结束multiprocessing所有进程
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何捕获kill信号,优雅的结束multiprocessing所有进程相关的知识,希望对你有一定的参考价值。
参考技术A 多数人可能会回答 kill -9 pid,这是一种在多数情况下正确的做法。不过本文打算阐述使用kill -9带来的一些问题,并给出另一种标准的kill方式。标准中断信号在Linux信号机制中,存在多种进程中断信号(Linux信号列表 )。 参考技术B 多数人可能会回答 kill -9 pid,这是一种在多数情况下正确的做法。不过本文打算阐述使用kill -9带来的一些问题,并给出另一种标准的kill方式。标准中断信号在Linux信号机制中,存在多种进程中断信号(Linux信号列表 )。本回答被提问者采纳发送/捕获 SIGTERM 的 Win32 API 模拟
【中文标题】发送/捕获 SIGTERM 的 Win32 API 模拟【英文标题】:Win32 API analog of sending/catching SIGTERM 【发布时间】:2010-11-16 01:13:47 【问题描述】:在 POSIX OS 下,有一个信号 API,允许向进程发送信号以将其关闭 使用 kill ,您可以使用 sigaction 捕获它并执行您需要的操作;
但是,Win32 不是 POSIX 系统,所以:
如何处理可能出现的关闭事件,例如来自“任务管理器”中的“结束进程”? 向 Win32 应用程序发送关机信号的标准 API 是什么?我不是在谈论 GUI,我在谈论应该很好地关闭的 TCP/IP 服务器。 不像 Windows 服务一样运行。
【问题讨论】:
【参考方案1】:MSDN Unix 代码迁移指南有一章是关于 Win32 code conversion and signal handling。 尽管 Microsoft 已决定将这份出色的指南存档,但它非常有用。
描述了三种方法: 原生信号 事件对象 消息
【讨论】:
【参考方案2】:您在第一个创建的线程上收到WM_QUIT
消息。
如果你不处理,你的进程会被强制关闭。
所以只需在你的第一个线程中实现一个消息队列,它会查找WM_QUIT
消息
【讨论】:
您应该处理 WM_CLOSE。 “WM_QUIT 消息与窗口无关,因此永远不会通过窗口的窗口过程接收。它只能由 GetMessage 或 PeekMessage 函数检索。” -MSDN 我可以对控制台 Ctrl+C 和作为 Windows 服务运行的进程使用相同的方法吗?或者我应该对它们中的每一个使用不同的方法? 您可以使用 taskkill /im your_program.exe 向应用程序发送终止信号。正如@Indy9000 所提到的,它将在 Windows 消息队列中触发 WM_CLOSE。【参考方案3】:MSDN 的 Windows 电源管理可能会有所帮助。但它处理的是系统事件而不是每个进程。
对于进程,您可以使用WM_CLOSE
检测终止。您需要处理 Windows 消息。如果它是一个控制台应用程序,您需要安装一个控制处理程序;看看 MSDN 上的SetConsoleCtrlHandler
【讨论】:
以上是关于如何捕获kill信号,优雅的结束multiprocessing所有进程的主要内容,如果未能解决你的问题,请参考以下文章