Win32 API 中类似于发送/捕获 SIGTERM 的功能对应是什么?

16

在POSIX操作系统下,有信号API可用于向进程发送信号以关闭它,可以使用kill发出信号并使用sigaction捕获它并执行所需操作;

然而,Win32不是POSIX系统,因此:

  • 我该如何处理可能来自“任务管理器”中的“终止进程”等关闭事件?
  • Win32应用程序接收关闭信号的标准API是什么?

我不是在谈论GUI,而是在谈论应该优雅关闭的TCP/IP服务器。它不是像Windows服务一样运行。

3个回答

8

MSDN的Unix代码迁移指南有一章关于Win32代码转换和信号处理

虽然微软已决定将这个出色的指南归档,但它非常有用。

该指南描述了三种方法:
本地信号
事件对象
消息


6

在你的第一个创建的线程上会收到一个WM_QUIT消息。

如果你不处理它,你的进程将被强制关闭。

因此,在你的第一个线程中实现一个消息队列,查找WM_QUIT消息即可。


2
你应该处理 WM_CLOSE 消息。"WM_QUIT 消息不与窗口关联,因此永远不会通过窗口的窗口过程接收到。它仅通过 GetMessage 或 PeekMessage 函数检索。" -MSDN - Indy9000
我可以同时使用相同的方法来处理控制台 Ctrl+C 和运行为 Windows 服务的进程吗?还是我需要为它们中的每一个使用不同的方法? - Artyom
你可以使用 taskkill /im your_program.exe 向应用程序发送终止信号。这将在Windows消息队列中触发一个 WM_CLOSE,正如@Indy9000所提到的那样。 - amilamad

3
也许来自MSDN的Windows电源管理对您有所帮助。但它处理的是系统事件而不是每个进程。
对于一个进程,您可以使用WM_CLOSE检测终止。您需要处理窗口消息。如果是控制台应用程序,您需要安装控制处理程序;请参阅MSDN上的SetConsoleCtrlHandler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接