c ++ system () процессы для сирот и зомби - PullRequest
2 голосов
/ 08 мая 2011

У меня есть небольшое приложение, назовем его «launch.exe». Это приложение на C ++.

То, что я делаю в этом, я вызываю system () 3 раза, чтобы запустить 3 других приложения. давайте назовем их A, B и C.

задача № 1
A, B и C являются приложениями с графическим интерфейсом, и "launch.exe" не может прогрессировать, пока не завершится А. Затем он застревает снова, пока не выйдет B. Затем снова застрял, пока C не выходит. Я бы хотел, чтобы lauch.exe мог работать, пока открытые приложения остаются открытыми.

Задача № 2
Предполагая, что я могу найти решение проблемы # 1, после запуска A, B и C я не хочу, чтобы файл launch.exe оставался открытым. Я хочу, чтобы launch.exe закрывался, и я хочу, чтобы A, B и C продолжали работать.

Вот сценарий для вас. Допустим, «launch.exe» запускает только одно приложение (назовем его A). Затем, после запуска A, если я закрываю "launch.exe", A остается открытым.

ОК ... это то, что я хочу, но что только что произошло? А сирота сейчас? И если так, это проблема?

А что если я закрою A перед тем, как выйти из launch.exe? На первый взгляд, все в порядке, но к чему это возвращает? Если бы я запустил exe в командной оболочке cmd, он бы вернулся к этому, но поскольку я сделал это из системного вызова () в приложении c ++, он возвращается к моему lauch.exe или становится зомби?

ПРИМЕЧАНИЯ:
Почему я использую систему ()?
- Потому что мне нужно что-то совместимое с Windows / Linux.
- Потому что мне нужно повысить привилегии до уровня администратора для некоторых запускаемых приложений.
- Я должен добавить, что крайне важно, чтобы A, B и C были полностью независимыми (по соображениям безопасности они не должны совместно использовать одно и то же пространство памяти или что-либо еще).
- Наконец, некоторые приложения, B и C, являются многопоточными (я утверждаю это, потому что я прочитал, что некоторые функции не запускают многопоточные приложения должным образом. Я не знаю, по каким причинам.).

Ответы [ 2 ]

3 голосов
/ 08 мая 2011

Используйте spawn вместо этого, это не будет блокировать лаунчер, пока ребенок не выйдет.

Или, так как вы уже используете Qt, используйте QProcess.


Не существует переносимого способа порождения подпроцесса как другого пользователя, но для Windows это CreateProcessWithLogonW.

1 голос
/ 09 мая 2011

Почему бы вам не запустить процессы ABC с амперсандом, добавленным к параметрам команды "&"

std::system ("ProcessA&");
std::system ("ProcessB&");
std::system ("ProcessC&");

Таким образом, ваша программа запуска не будет ждать завершения этих процессов.

Тогдавыйдите из панели запуска с помощью QApplication::exit или QApplication::quit

Прочтите этот SO вопрос , чтобы увидеть разницу между fork / execvp и system ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...