在用 C++ 实现应用服务器及其客户端库时,我无法找到一种干净可靠的方法来在 Windows 上的服务器关闭时停止客户端进程。
假设服务器和它的客户端在同一个用户下运行,要求是:
- 该解决方案应适用于以下情况:
- 每个客户端都可能具有控制台或 gui。
- 用户可能没有特权。
- 客户端可能会或变得无响应(无限循环、死锁)。
- 客户端可能是也可能不是服务器的孩子(直接或间接)。
- 除非被客户端缺陷阻止,否则应允许客户端有机会干净地退出(释放他们的资源,将一些数据同步到磁盘......)和一些合理的时间这样做。
- 在关闭过程中,所有客户端返回代码都应提供给服务器(如果可能)。
- 服务器将等到所有客户端都消失。
截至本次编辑,以下大多数答案都主张在服务器及其客户端之间使用共享内存(或其他 IPC 机制)来传达关闭命令和客户端状态。这些解决方案可以工作,但需要客户端成功初始化库。
我没有说的是,服务器还用于启动客户端,在某些情况下,其他程序/脚本根本不使用客户端库。不依赖于服务器和客户端之间的优雅通信的解决方案会更好(如果可能的话)。
前段时间,我偶然发现了一个 C 代码片段(我相信在 MSDN 中),它执行了以下操作:
- 在进程中通过 CreateRemoteThread 启动一个线程来关闭。
- 让那个线程直接调用ExitProcess。
不幸的是,现在我正在寻找它,但我无法找到它,而且搜索结果似乎暗示这个技巧在 Vista 上不再适用。对此有任何专家意见吗?