2012-03-22 14 views
9

Zakładając Mam te dwa fakty rację: -Jak uruchomić proces i uczynić go „niezależny”

CreateProcess() rozpoczyna proces i pozwala kontynuować podczas gdy program działa, ale gdy program kończy, dziecko proces z tym idzie. Ponadto twój program musi wziąć pod uwagę, kiedy proces potomny zostanie zakończony, aby mógł poprawnie zwolnić uchwyt procesu.

system() rozpoczyna proces, czeka na zakończenie, a następnie kontynuuje program.

  • to, co muszę wiedzieć, to jak rozpocząć proces i pozwolić mu działać niezależnie od mojego programu i utrzymywać się po wyjściu mojego programu. Nie muszę przechwytywać jego wyjścia lub mieć nad nim dalszej kontroli, chcę tylko pozwolić użytkownikowi na interakcję z nim - tak jak chcę napisać alternatywę do polecenia Uruchom Menu Start.

Czy to możliwe, faktycznie to możliwe?

+4

Próbowałeś z 'DETACHED_PROCESS' lub' CREATE_NEW_PROCESS_GROUP' [Tworzenie flagi procesowe] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684863%28v=vs.85%29 .aspx) do "CreateProcess"? –

+4

Twoje założenie jest nieprawidłowe. –

+0

quick hack: 'system (" start yourprocess.exe ")' – smerlin

Odpowiedz

6

CreateProcess() nie czeka na zakończenie procesu potomnego, natychmiast zwraca. Użyj opcji WaitForSingleObject, jeśli chcesz poczekać. Nie, proces potomny nie zostanie automatycznie zabity, gdy rodzic istnieje, a uchwyt jest w każdym razie automatycznie zwalniany przez system operacyjny, nie trzeba tego robić samodzielnie (w przypadku korzystania z nowoczesnej wersji systemu Windows).

Podobnie jak inne zasoby systemu operacyjnego (obiekty gdi, obiekty użytkowników, obiekty jądra), jeśli nie zniszczysz/nie zwolnisz/nie zamkniesz zasobu, będziesz miał wyciek zasobów podczas działania aplikacji. Powinieneś zamknąć oba uchwyty zwrócone z CreateProcess wkrótce po zwróceniu CreateProcess.

+0

Czy jesteś pewien, że proces potomny nie zostanie automatycznie zabity, gdy rodzic wyjdzie? Zauważyłem dokładnie to zachowanie, które doprowadziło mnie do tego pytania. – user4815162342

+0

Obserwuję to samo. Dopóki w flagach tworzenia nie zostanie określona wartość DETACHED_PROCESS, rodzic faktycznie usuwa dziecko. –

4

Można określić "DETACHED_PROCESS" w CreationFlags Podoba kodu następującym snippent:

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(); 
    } 

To sprawi YUR procesy niezależne. Mam nadzieję, że to Ci pomoże.

+0

Nie ma sensu łączyć flag 'CREATE_NO_WINDOW' z' DETACHED_PROCESS'. Flaga 'CREATE_NO_WINDOW' jest ignorowana, jeśli aplikacja nie jest aplikacją konsolową lub jest używana z' CREATE_NEW_CONSOLE' lub 'DETACHED_PROCESS'. Zobacz https://msdn.microsoft.com/en-us/library/windows/desktop/ms684863(v=vs.85).aspx –

Powiązane problemy