При реализации аппликативного сервера и его клиентских библиотек на C ++ у меня возникают проблемы с поиском чистого и надежного способа остановки клиентских процессов при завершении работы сервера в Windows.
Предполагая, что сервер и его клиенты работают под одним и тем же пользователем, требования:
- решение должно работать в следующих случаях:
- может иметь либо консоль, либо графический интерфейс.
- пользователь может быть непривилегирован.
-
- клиенты могут быть или перестать отвечать (бесконечный цикл, тупик).
- клиенты могут или не могут быть дочерними элементами сервера (прямым или косвенным).
- Если это не предотвращено дефектом на стороне клиента, клиентам должна быть предоставлена возможность чистого выхода (освободить свои ресурсы, синхронизировать некоторые данные на диск ...) и некоторое разумное время для этого.
- все клиентские коды возврата должны быть доступны (если возможно) серверу во время процедуры выключения.
- сервер должен подождать, пока не исчезнут все клиенты.
Начиная с этого редактирования, большинство ответов ниже защищают использование совместно используемой памяти (или другого механизма IPC) между сервером и его клиентами для передачи заказов на отключение и статуса клиента. Эти решения будут работать, но требуют, чтобы клиенты успешно инициализировали библиотеку.
Что я не сказал, так это то, что сервер также используется для запуска клиентов и в некоторых случаях других программ / сценариев, которые вообще не используют клиентскую библиотеку. Решение, которое не основывалось бы на изящном взаимодействии между сервером и клиентами, было бы лучше (если это возможно).
Некоторое время назад я наткнулся на фрагмент кода C (в MSDN, который я считаю), который сделал следующее:
- запустить процесс через CreateRemoteThread в процессе до завершения.
- заставил этот поток напрямую вызвать ExitProcess.
К сожалению, теперь, когда я его ищу, я не могу его найти, и результаты поиска, похоже, означают, что этот прием больше не работает в Vista. Любой экспертный вклад по этому вопросу?