Как начать процесс и сделать его «независимым» - PullRequest
11 голосов
/ 22 марта 2012

Предполагая, что я правильно понял эти два факта: -

CreateProcess() запускает процесс и позволяет вашей программе продолжаться, пока она выполняется, но когда ваша программа завершается, дочерний процесс завершается с ним.Кроме того, ваша программа должна учитывать, когда завершается дочерний процесс, чтобы он мог правильно освободить дескриптор процесса.

system() запускает процесс, ожидает его завершения и продолжает работу с вашей программой.

  • мне нужно знать, как запустить процесс и позволить ему запускаться независимо от моей программы и сохранять его после выхода из программы.Мне не нужно захватывать его выходные данные или иметь какой-либо дополнительный контроль над ним, я просто хочу позволить пользователю взаимодействовать с ним - как, например, я хотел написать альтернативу команде запуска меню «Пуск».

Так возможно ли это на самом деле?

Ответы [ 2 ]

7 голосов
/ 22 марта 2012

CreateProcess() не ожидает завершения дочернего процесса по умолчанию, возвращается немедленно. Используйте WaitForSingleObject, если хотите подождать. Нет, дочерний процесс не завершается автоматически при выходе из родительского процесса, и дескриптор в любом случае автоматически освобождается операционной системой, поэтому нет необходимости делать это самостоятельно (если вы используете современную версию windows).

Как и любой ресурс ОС (объекты gdi, объекты пользователя, объекты ядра), если вы не уничтожите / не освободите / не закроете ресурс самостоятельно, у вас будут утечки ресурсов во время работы приложения. Вы должны закрыть обе ручки, возвращенные с CreateProcess вскоре после возврата CreateProcess.

4 голосов
/ 05 сентября 2014

Вы можете указать «DETACHED_PROCESS» в CreationFlags Как следующий фрагмент кода:

if (CreateProcessW(NULL, (LPWSTR) L"File.exe ",
        0, 0, false,CREATE_DEFAULT_ERROR_MODE | CREATE_NO_WINDOW | DETACHED_PROCESS , 0, 0,
        &siStartupInfo, &piProcessInfo) != false)
    {
        /* Watch the process. */
        dwExitCode = WaitForSingleObject(piProcessInfo.hProcess, (2 * 1000));
    }
    else
    {

        /* CreateProcess failed */
        iReturnVal = GetLastError();
    }

Это сделает ваши процессы независимымиЯ надеюсь, что это поможет вам.

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