Pregunta

Quiero escribir un programa, que pondrá en marcha un proceso hijo. El proceso hijo puede ser el modo de ventanas o programa en modo consola.

Quiero monitorizar el estado del proceso infantil y la utilización de recursos. p.ej. Quiero saber el proceso hijo todavía está en marcha o terminada. Si se termina, quiero saber la razón (se termina normalmente o debido a caída?).

Y durante el proceso hijo de funcionamiento y / o terminado, quiero conocer su uso de los recursos, sobre todo el tiempo de CPU (tiempo del usuario, del sistema) y el uso de memoria (tamaño virtual y / o RSS). Está bien si los números no son muy precisos.

En la terminología de Unix, quiero tenedor, ejecutivo, waitpid y getrusage. Y tenedor + + setrusage Exec puede limitar el uso de recursos del niño. Pero no sé cómo hacer esto en la plataforma Windows.

Por favor, que me señale el nombre de API de Windows. Podría estudiar el resto a mí mismo.

Prefiero no usar otra biblioteca de la API de Windows. Prefiero que no es el padre trabaja como depurador y adjuntando al proceso hijo. Simplemente no prefieren, pero todavía aceptable.

¿Fue útil?

Solución

Cuando se llama a CreateProcess, devuelve un identificador para el proceso.

WaitForSingleObject en un identificador de proceso se bloqueará hasta que el proceso ha salido o de tiempo de espera ha expirado. Un tiempo de espera de cero volverá inmediatamente e indicar si el proceso todavía está en marcha.

BOOL IsProcessRunning(HANDLE process)
{
    return WaitForSingleObject(process, 0) != WAIT_OBJECT_0;
}

void WaitForProcessToExit(HANDLE process)
{
    WaitForSingleObject(process, INFINITE);
}

Para obtener el código de salida de un proceso en ejecución, puede utilizar GetExitCodeProcess. Tendrá que interpretar lo que significa que el código de error, sin embargo. 0XC0000005 es típico de una violación de acceso, pero no todos los accidentes resultan en este código de error.

Para el uso de recursos, puede llamar GetProcessTimes para obtener el tiempo total de CPU, GetGuiResources para obtener GDI manejar información, GetProcessMemoryInfo para obtener estadísticas de memoria, y GetProcessIoCounters para obtener información IO.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top