在 Win32 上停止进程的最干净方法?

标签 c user-interface winapi console ipc

在使用 C++ 实现应用服务器及其客户端库时,我无法找到一种干净可靠的方法来在 Windows 上关闭服务器时停止客户端进程。

假设服务端和它的客户端在同一个用户下运行,要求是:

  • 该解决方案应适用于以下情况:
    • 每个客户端都可以配备控制台或图形用户界面。
    • 用户可能没有特权。
    • 客户端可能会或变得无响应(无限循环、死锁)。
    • 客户端可能是也可能不是服务器的子级(直接或间接)。
  • 除非被客户端缺陷阻止,否则应允许客户端有机会干净地退出(释放他们的资源,将一些数据同步到磁盘......)和一些合理的时间来这样做。
  • 在关闭过程中,所有客户端返回代码都应(如果可能)提供给服务器。
  • 服务器应等到所有客户端都消失。

在这次编辑中,下面的大部分答案都提倡在服务器和它的客户端之间使用共享内存(或其他 IPC 机制)来传达关闭命令和客户端状态。这些解决方案可行,但需要客户端成功初始化库。

我没有说的是,服务器还用于启动客户端,在某些情况下还用于启动根本不使用客户端库的其他程序/脚本。不依赖于服务器和客户端之间优雅通信的解决方案会更好(如果可能)。

前段时间,我偶然发现了一个 C 代码片段(我相信是在 MSDN 中),它执行了以下操作:

  1. 在关闭进程中通过CreateRemoteThread启动一个线程。
  2. 让该线程直接调用 ExitProcess。

不幸的是,现在我正在寻找它,但找不到它,而且搜索结果似乎暗示这个技巧在 Vista 上不再有效。对此有专家意见吗?

最佳答案

如果您使用线程,一个简单的解决方案是使用命名的系统事件,线程在事件上休眠以等待它收到信号,控制应用程序可以在它希望客户端应用程序退出时发出事件信号。

对于 UI 应用程序,它(线程)可以向主窗口发送消息,WM_CLOSE 或 QUIT 我忘记了,在控制台应用程序中它可以发出 CTRL-C 或者如果主控制台代码循环它可以检查线程设置的一些退出条件。

无论哪种方式,与其查找客户端应用程序并告诉它们退出,不如使用操作系统发出它们应该退出的信号。如果休眠线程使用 WaitForSingleObject 休眠,它几乎不会占用 CPU 空间。

关于在 Win32 上停止进程的最干净方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/81727/

相关文章:

c - 递归阶乘实现的段错误

c++ - Qt 获取事件文本框

sql-server - SSMS 状态栏颜色错误

c - 在线程函数中获取句柄

c++ - 我可以在 Vista 和 Windows 7 下以用户模式获得对原始磁盘扇区的写访问权限吗?

c - 免费(): invalid pointer at 2nd element

c++ - 我想知道我们使用的ide是否包含链接器

c# - 用于多列使用的 ListView 与 ListBox

c++ - 使用作业对象限制 Windows 进程内存/执行时间 - 我的代码有什么问题?

c++ - 使用 C 或 C++(或 Ada 95)进行 Windows LDAP 组用户检查