2012-03-22 18 views
9

Supponendo Ho questi due fatti a destra: -Come avviare un processo e renderlo 'indipendente'

CreateProcess() avvia un processo e lascia il tuo programma di continuare durante l'esecuzione, ma quando il programma termina, il bambino processo scende con esso. Inoltre, il tuo programma deve prendere nota di quando il processo figlio termina in modo che possa rilasciare correttamente l'handle del processo.

system() avvia un processo, attende che si completi e continua con il programma.

  • quello che devo sapere è come avviare un processo e farlo funzionare indipendentemente dal mio programma, e persistere dopo che il mio programma è terminato. Non ho bisogno di catturarne l'output o di controllarlo ulteriormente, voglio solo consentire all'utente di interagire con esso, come dire che volevo scrivere un'alternativa al comando Esegui menu Start.

Così è, per favore, effettivamente possibile farlo?

+4

Hai provato con 'DETACHED_PROCESS' o' CREATE_NEW_PROCESS_GROUP' [flag di creazione processo] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684863%28v=vs.85%29 .aspx) a 'CreateProcess'? –

+4

La tua ipotesi non è corretta. –

+0

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

risposta

6

CreateProcess() non attende il completamento del processo figlio per impostazione predefinita, restituisce immediatamente. Usa WaitForSingleObject se vuoi aspettare. No, il processo figlio non viene ucciso automaticamente quando genitore esiste e l'handle è comunque liberato automaticamente dal sistema operativo, non è necessario farlo da solo (se si utilizza una versione moderna di Windows).

Proprio come qualsiasi risorsa del sistema operativo (oggetti gdi, oggetti utente, oggetti del kernel), se non si distrugge/rilascia/chiude la risorsa da soli, si avranno perdite di risorse durante l'esecuzione dell'applicazione. È necessario chiudere entrambi gli handle restituiti da CreateProcess subito dopo la restituzione di CreateProcess.

+0

Sei sicuro che il processo figlio non viene ucciso automaticamente quando esce il genitore? Ho osservato esattamente quel comportamento, che mi ha portato a questa domanda. – user4815162342

+0

Osservo lo stesso. A meno che non specifichi DETACHED_PROCESS nei flag di creazione, il genitore in realtà abbatte il bambino. –

4

È possibile specificare "DETACHED_PROCESS" in CreationFlags come il seguente codice di 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(); 
    } 

Questo renderà yur processi indipendenti. Spero che questo ti aiuta.

+0

Non ha senso combinare le bandiere 'CREATE_NO_WINDOW' con' DETACHED_PROCESS'. Il flag 'CREATE_NO_WINDOW' viene ignorato se l'applicazione non è un'applicazione console, o se viene utilizzata con' CREATE_NEW_CONSOLE' o 'DETACHED_PROCESS'. Vedere https://msdn.microsoft.com/en-us/library/windows/desktop/ms684863(v=vs.85).aspx –

Problemi correlati