2015-04-27 2 views
4

Мне нужно запустить процесс и запустить его как отдельный процесс. У меня есть какое-то стартовое приложение, целью которого является запуск другого exe и немедленный выход. Каков наилучший способ достичь этого?Начать процесс не как ребенок

Я читал CreateProcess документацию несколько раз, но у меня остались вопросы. Документация говорит, что мне нужно позвонить CloseHandle после того, как я закончу. Но мое родительское приложение не должно ждать выхода ребенка. Другая часть документации говорит о том, что я могу оставить только ручки - система закроет их, когда родительский процесс завершится. Означает ли это, что дочернее приложение выходит сразу после родителя? Кажется, это не так - я закрываю стартер, но мой дочерний процесс все еще работает.

Есть DETACHED_PROCESS флаг, который кажется тем, что я ищу. Но документация говорит о консоли. Какая консоль? Меня не интересует консоль.

+2

Вызов 'CloseHandle' на дескрипторе процесса не завершает процесс. Он просто закрывает ваш дескриптор объекту процесса. Объект процесса все еще существует и будет продолжать свою работу. Итак, вызовите 'CreateProcess', а затем завершите процесс запуска. Если хотите, вызовите 'CloseHandle' на две ручки. Или нет, и система будет их убирать. –

ответ

3

DETACHED_PROCESS flag documentation состояния

Для консольных процессов, новый процесс не наследует консоль своего родителя (по умолчанию)

, что означает: если у вас есть процесс консоли и вы начинаете новый, он не наследует консоль своего родителя.

Если у вас нет консольного процесса, вам не о чем беспокоиться.

CreateProcess создает дочерний процесс, но не дожидается завершения дочернего процесса, так что вы уже настроены.

Если вы хотите ждать для дочернего процесса, чтобы закончить, вы должны были назвать CreateProcess, а затем WaitForSingleObject

Резюмируя:

// Version 1) Launch and wait for a child process completion 
STARTUPINFO info = { sizeof(info) }; 
PROCESS_INFORMATION processInfo; 
if (CreateProcess(L"C:\\myapp.exe", L"", NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo)) { 
    ::WaitForSingleObject(processInfo.hProcess, INFINITE); // DO WAIT for the child to exit 
    CloseHandle(processInfo.hProcess); 
    CloseHandle(processInfo.hThread); 
} 

// ---------------------------------------------------------------- 

// Version 2) Launch and do NOT wait for a child process completion 
STARTUPINFO info = { sizeof(info) }; 
PROCESS_INFORMATION processInfo; 
if (CreateProcess(L"C:\\myapp.exe", L"", NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo)) { 
    CloseHandle(processInfo.hProcess); // Cleanup since you don't need this 
    CloseHandle(processInfo.hThread); // Cleanup since you don't need this 
} 

обратите внимание, что версия 2 будет не прекратить ваши дочерний процесс. Будут выпущены только те ресурсы, которые больше не нужны.

+1

О, я думал, что закрытие дескриптора означает закрытие приложения ... И что, если стартер выйдет, но ребенок напишет на консоль (если мы не укажем флаг)? Я использую приложение gui в качестве дочернего, поэтому я не могу проверить. – nikitablack

+1

@nikitablacka Приложение win32 не будет использовать консольную подсистему. В этом случае проблем нет. –

4

Несколько раз я читал документацию по CreateProcess, но у меня остались вопросы. Документация говорит, что мне нужно позвонить CloseHandle после того, как я закончу. Но мое родительское приложение не должно ждать выхода ребенка.

Хорошо, тогда не ждите. Вы можете позвонить CloseHandle непосредственно в родительский.

В другой части документации говорится, что я могу оставить только ручки - система закроет их, когда родительский процесс завершится. Означает ли это, что дочернее приложение выходит сразу после родителя? Кажется, это не так - я закрываю стартер, но мой дочерний процесс все еще работает.

Нет, это не так. Я не уверен, как вы получили это из документации, но это не значит, что это значит.

Есть флаг DETACHED_PROCESS, который кажется тем, что я ищу. Но документация говорит о консоли. Какая консоль? Меня не интересует консоль.

Если вам все равно, то не беспокойтесь об этом.

Смежные вопросы