发送/捕获 SIGTERM 的 Win32 API 模拟
Posted
技术标签:
【中文标题】发送/捕获 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
【讨论】:
以上是关于发送/捕获 SIGTERM 的 Win32 API 模拟的主要内容,如果未能解决你的问题,请参考以下文章
python win32api win32gui win32con 窗口句柄 发送消息 常用方法 键盘输入
程序对我在 Python 中使用 win32api 发送的消息没有反应