При реализации прикладного сервера и его клиентских библиотек на C ++ у меня возникают проблемы с поиском чистого и надежного способа остановки клиентских процессов при завершении работы сервера в Windows.
Предполагая, что сервер и его клиенты работают под одним и тем же пользователем, требования следующие:
- the solution should work in the following cases:
- clients may each feature either a console or a gui.
- user may be unprivileged.
- clients may be or become unresponsive (infinite loop, deadlock).
- клиенты могут быть или не быть дочерними по отношению к серверу (прямым или косвенным).
- если это не предотвращено из-за дефекта на стороне клиента, клиентам должна быть предоставлена возможность полностью завершить работу (освободить свои ресурсы, синхронизировать некоторые данные с диском ...) и некоторое разумное время для этого.
- все коды возврата клиента должны быть доступны (если возможно) серверу во время процедуры выключения.
- сервер будет ждать, пока не исчезнут все клиенты.
Что касается этого редактирования, большинство ответов ниже рекомендуют использование общей памяти (или другого механизма IPC) между сервером и его клиентами для передачи приказов на отключение и статуса клиента. Эти решения будут работать, но потребуют от клиентов успешной инициализации библиотеки.
Я не сказал, что сервер также используется для запуска клиентов и в некоторых случаях других программ / сценариев, которые вообще не используют клиентскую библиотеку. Решение, которое не полагалось бы на изящную связь между сервером и клиентами, было бы лучше (если возможно).
Некоторое время назад я наткнулся на фрагмент C (я полагаю, в MSDN), который делал следующее:
- запустить поток через CreateRemoteThread в процессе завершения.
- этот поток напрямую вызвал ExitProcess.
К сожалению, теперь, когда я ищу его, я не могу его найти, и результаты поиска, похоже, предполагают, что этот трюк больше не работает в Vista. Есть ли мнение экспертов по этому поводу?