在使用 C++ 实现应用服务器及其客户端库时,我无法找到一种干净可靠的方法来在 Windows 上关闭服务器时停止客户端进程。
假设服务端和它的客户端在同一个用户下运行,要求是:
- 该解决方案应适用于以下情况:
- 每个客户端都可以配备控制台或图形用户界面。
- 用户可能没有特权。
- 客户端可能会或变得无响应(无限循环、死锁)。
- 客户端可能是也可能不是服务器的子级(直接或间接)。
- 除非被客户端缺陷阻止,否则应允许客户端有机会干净地退出(释放他们的资源,将一些数据同步到磁盘......)和一些合理的时间来这样做。
- 在关闭过程中,所有客户端返回代码都应(如果可能)提供给服务器。
- 服务器应等到所有客户端都消失。
在这次编辑中,下面的大部分答案都提倡在服务器和它的客户端之间使用共享内存(或其他 IPC 机制)来传达关闭命令和客户端状态。这些解决方案可行,但需要客户端成功初始化库。
我没有说的是,服务器还用于启动客户端,在某些情况下还用于启动根本不使用客户端库的其他程序/脚本。不依赖于服务器和客户端之间优雅通信的解决方案会更好(如果可能)。
前段时间,我偶然发现了一个 C 代码片段(我相信是在 MSDN 中),它执行了以下操作:
- 在关闭进程中通过CreateRemoteThread启动一个线程。
- 让该线程直接调用 ExitProcess。
不幸的是,现在我正在寻找它,但找不到它,而且搜索结果似乎暗示这个技巧在 Vista 上不再有效。对此有专家意见吗?
最佳答案
如果您使用线程,一个简单的解决方案是使用命名的系统事件,线程在事件上休眠以等待它收到信号,控制应用程序可以在它希望客户端应用程序退出时发出事件信号。
对于 UI 应用程序,它(线程)可以向主窗口发送消息,WM_CLOSE 或 QUIT 我忘记了,在控制台应用程序中它可以发出 CTRL-C 或者如果主控制台代码循环它可以检查线程设置的一些退出条件。
无论哪种方式,与其查找客户端应用程序并告诉它们退出,不如使用操作系统发出它们应该退出的信号。如果休眠线程使用 WaitForSingleObject 休眠,它几乎不会占用 CPU 空间。
关于在 Win32 上停止进程的最干净方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/81727/