アプリケーションサーバーとそのクライアント側ライブラリをC++で実装しているときに、Windowsのサーバーシャットダウン時にクライアントプロセスを停止するためのクリーンで信頼性の高い方法を見つけるのに苦労しています。
サーバーとそのクライアントが同じユーザーの下で実行されていると仮定すると、要件は次のとおりです。
- このソリューションは、次の場合に機能するはずです。
- クライアントはそれぞれ、コンソールまたはGUIのいずれかを備えている場合があります。
- ユーザーには特権がない可能性があります。
- クライアントは応答しなくなるか、応答しなくなる可能性があります(無限ループ、デッドロック)。
- クライアントはサーバーの子である場合とそうでない場合があります(直接または間接)。
- クライアント側の欠陥によって防止されない限り、クライアントはクリーンに終了する機会(リソースを解放し、一部のデータをディスクに同期する...)と、そうするための妥当な時間を許可されるものとします。
- すべてのクライアントリターンコードは、シャットダウン手順中にサーバーで利用できるようにする必要があります(可能な場合)。
- サーバーは、すべてのクライアントがなくなるまで待機する必要があります。
この編集の時点で、以下の回答の大部分は、サーバーとそのクライアント間で共有メモリ(または別のIPCメカニズム)を使用してシャットダウン命令とクライアントステータスを伝達することを推奨しています。これらのソリューションは機能しますが、クライアントがライブラリを正常に初期化する必要があります。
私が言わなかったことは、サーバーはクライアントを起動するためにも使用され、場合によってはクライアントライブラリをまったく使用しない他のプログラム/スクリプトも使用されるということです。サーバーとクライアント間の適切な通信に依存しないソリューションの方が優れています(可能な場合)。
しばらく前に、次のことを行うCスニペット(MSDNで私が信じている)に出くわしました。
- シャットダウンするプロセスでCreateRemoteThreadを介してスレッドを開始します。
- そのスレッドにExitProcessを直接呼び出させました。
残念ながら、今探しているのですが、見つけることができず、検索結果は、このトリックがVistaでは機能しなくなったことを示唆しているようです。これに関する専門家の意見はありますか?