Служба Windows завершается при вызове дочернего процесса с помощью _execv () - PullRequest
1 голос
/ 09 декабря 2010

У меня есть приложение C ++ для Windows, которое было разработано как служба Windows. Он периодически выполняет обновление, чтобы увидеть, есть ли новая версия. Для запуска средства обновления используется _execv(). Программа обновления ищет новые версии, загружает их и останавливает службу Windows (все эти действия регистрируются), заменяет файлы и снова запускает службу. Выполнение этого в режиме CLI (без перехода в сервисный режим) прекрасно работает таким образом. Согласно моим файлам журнала, дочерний процесс запускается, но родительский процесс (служба Windows) завершается.

Разрешено ли даже запускать дочерние процессы в службах Windows, и почему служба неожиданно завершает работу? В моих файлах журнала нет ошибок (я даже отслеживаю ошибки сегментов и т. Д., Которые записываются в журнал).

Ответы [ 2 ]

1 голос
/ 09 декабря 2010

_execv заменяет существующий процесс новым, в котором выполняется файл, который вы передаете в качестве параметра. Под Unix (и подобным) это обрабатывается напрямую / изначально. Windows, однако, не поддерживает это напрямую - так что это делается путем выхода из родительского процесса и организации запуска дочернего процесса, как только он это сделает.

IOW, похоже, что _execv делает именно то, для чего он предназначен - но в этом случае, вероятно, это не то, что вы действительно хотите. Вы можете порождать процесс из службы, но обычно вы хотите использовать CreateProcessAsUser для его создания под определенной учетной записью вместо учетной записи службы (которой назначен довольно необычный набор прав). Затем сервисный процесс завершается и перезапускается, когда диспетчер службы запрашивает его, когда ваш обновитель вызывает ControlService, CreateService и т. Д.

1 голос
/ 09 декабря 2010

Почему вы используете _execv() вместо того, чтобы делать это в Windows, и используете CreateProcess()?

Я предполагаю, что вы внесли некоторую отладку в свой сервис и не достигли точки, когдаВы звоните _execv() к вашим услугам?

...