Tengo una aplicación A que me gustaría poder invocar otros procesos arbitrarios según lo especificado por un usuario en un archivo de configuración.¿Ejecutar subprocesos arbitrarios en Windows y todavía terminar limpiamente?
La secuencia de comandos B de lotes es uno de los procesos que un usuario desearía invocar por A. B configura algunas variables de entorno, muestra algunos mensajes e invoca un compilador C para hacer algún trabajo.
¿Proporciona Windows una forma estándar para que los procesos arbitrarios terminen de forma limpia? Supongamos que A se ejecuta en una consola y recibe un CTRL + C. ¿Puede pasar esto a B y C? Supongamos que A se ejecuta en una ventana y el usuario intenta cerrar la ventana, ¿puede cancelar B y C?
TerminateProcess es una opción, pero no muy buena. Si A usa TerminateProcess en B, C sigue ejecutándose. Esto podría causar problemas desagradables si C es de larga ejecución, ya que podríamos iniciar otra instancia de C para operar en los mismos archivos mientras la primera instancia de C aún está funcionando secretamente. Además, TerminateProcess no da como resultado una salida limpia.
GenerateConsoleCtrlEvent suena bien, y podría funcionar cuando todo se ejecuta en una consola, pero la documentación dice que solo puede enviar CTRL + C a su propia consola y no ayudaría si A se ejecutara en una ventana.
¿Hay algún equivalente a SIGINT en Windows? Me encantaría encontrar un artículo como este: http://www.cons.org/cracauer/sigint.html para Windows.
+1 para una buena pregunta. Es curioso que no haya habido respuestas ... No conozco un mecanismo de señal en Win32. Cuando necesité notificar los procesos secundarios, publiqué un mensaje WM_CLOSE para las aplicaciones GUI. Para las aplicaciones de consola, las creé adjuntando flujos de entrada y salida a la aplicación principal y cuando quise terminarlas, simplemente cerré el flujo de entrada. En cuanto a hijos de niños, etc., confié en mis hijos directos para limpiar sus dependencias :). –