2012-03-22 13 views
9

Suponiendo Tengo estos dos hechos como son: -Cómo iniciar un proceso y hacerlo 'independiente'

CreateProcess() inicia un proceso y le permite continuar su programa mientras se ejecuta, pero cuando el programa termina, el niño proceso se cae con eso. Además, su programa debe tomar nota de cuándo finaliza el proceso secundario para que pueda liberar correctamente el identificador del proceso.

system() inicia un proceso, espera a que se complete y luego continúa con su programa.

  • lo que necesito saber es cómo iniciar un proceso y dejarlo funcionar independientemente de mi programa, y ​​persistir después de que mi programa termine. No necesito capturar su salida o tener más control sobre ella, solo quiero que el usuario interactúe con ella, como decir que quería escribir una alternativa al comando Ejecutar del menú Inicio.

Entonces, ¿es posible hacerlo?

+4

¿Has probado con 'DETACHED_PROCESS' o' CREATE_NEW_PROCESS_GROUP' [indicadores de creación de procesos] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms684863%28v=vs.85%29 .aspx) a 'CreateProcess'? –

+4

Su suposición es incorrecta. –

+0

hack rápido: 'system (" start yourprocess.exe ")' – smerlin

Respuesta

6

CreateProcess() no espera a que el proceso hijo termine de forma predeterminada, vuelve inmediatamente. Use WaitForSingleObject si desea esperar. No, el proceso hijo no se elimina automáticamente cuando el padre existe, y el sistema operativo libera automáticamente el identificador, no es necesario que lo haga usted mismo (si usa una versión moderna de Windows).

Al igual que cualquier recurso del sistema operativo (objetos gdi, objetos de usuario, objetos kernel), si no destruye/libera/cierra el recurso usted mismo tendrá fugas de recursos mientras se ejecuta su aplicación. Debe cerrar ambos identificadores devueltos de CreateProcess poco después de que CreateProcess regrese.

+0

¿Estás seguro de que el proceso secundario no se elimina automáticamente cuando el padre sale? He observado exactamente ese comportamiento, lo que me llevó a esta pregunta. – user4815162342

+0

Observo lo mismo. A menos que especifique DETACHED_PROCESS en los indicadores de creación, el padre realmente derriba al niño. –

4

Puede especificar "DETACHED_PROCESS" en CreationFlags como el siguiente código 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(); 
    } 

Esto hará que yur procesos independientes. Espero que esto te ayude.

+0

No tiene sentido combinar las banderas 'CREATE_NO_WINDOW' con' DETACHED_PROCESS'. El indicador 'CREATE_NO_WINDOW' se ignora si la aplicación no es una aplicación de consola, o si se usa con' CREATE_NEW_CONSOLE' o 'DETACHED_PROCESS'. Consulte https://msdn.microsoft.com/en-us/library/windows/desktop/ms684863(v=vs.85).aspx –

Cuestiones relacionadas