Pregunta

Sobrecargué las 6 señales enumeradas en este sitio http: // www. cplusplus.com/reference/clibrary/csignal/signal.html

Luego ejecuté mi aplicación (doble clic no ejecutó IDE) e intenté 1) finalizar la tarea 2) X en vertical y 3) matar proceso. Esperaba que los dos primeros causaran algún tipo de señal (estoy en XP) pero desgraciadamente no obtuve nada. ¿No se me permite abrir archivos para escribir cuando se produce una señal? supongo que lo estoy (SIGSEGV me lo permitió).

Cuando Firefox falla o cuando lo mato, recuerda en qué páginas estaba. ¿Registra la dirección cada vez que hago clic en una página o lo hace en una señal / bloqueo?

mi pregunta principal es qué señal puedo usar para atrapar el proceso de matar

¿Fue útil?

Solución

Win32 no proporciona una opción para interceptar su programa que se está ejecutando con TerminateProcess (que es lo que sucederá cuando & "; Finalizar tarea &"; desde el Administrador de tareas o haga clic en [X]) .

Puede captar la señal SIGSEGV porque la biblioteca de tiempo de ejecución C proporciona una emulación de esta señal cuando se ejecuta en Windows. Cuando su programa causa una infracción de acceso a Windows (excepción 0xC0000005), la biblioteca de tiempo de ejecución tiene la opción de detectar eso y simular un SIGSEGV estilo Unix para usted. Sin embargo, esta no es la mejor manera de manejar tal excepción. Si está escribiendo un programa Win32, generalmente no debería intentar utilizar los servicios de estilo Unix.

Otros consejos

Puede detectar un error de tiempo de ejecución como una infracción de acceso si anula el controlador de excepción predeterminado que llama a SetUnhandledExceptionFilter (esta es una función win32 y, como tal, no depende de la emulación de la biblioteca C). Este es el método que se puede usar para proporcionar & Quot; minidumps & Quot; cuando un programa falla.

Pero este manejador de excepciones no se llamará cuando normalmente cierre su aplicación, o cuando su aplicación esté cerrada desde el Administrador de tareas. En el último caso, Windows está llamando a TerminateProcess, no es un cierre limpio, pero está obligando a su programa a finalizar.

No sé cuál es la implementación utilizada por Firefox, pero para guardar las pestañas actuales abiertas es probable que se ejecute un temporizador, y cada vez que se ejecuta guarda el historial en un archivo y algún tipo de suciedad marca.

Otras soluciones más complejas para detectar cuando un programa está cerrado (implementado por antivirus y programas similares) es tener dos programas no relacionados ejecutándose, cada uno verificando que el otro aún se está ejecutando, y si uno detecta que el otro está cerrado, ejecútelo de nuevo.

Las aplicaciones de Windows son aplicaciones de consola o aplicaciones GUI. Las aplicaciones de consola tienden a obtener WM_CLOSE, las aplicaciones de consola CTRL_CLOSE_EVENT. Tampoco son señales; ninguno se enviaría si su aplicación finaliza a través de TerminateProcess ().

Si desea almacenar donde estaba, use un archivo mapeado en memoria y actualícelo en cada acción. Cuando finaliza el proceso, el sistema operativo vuelve a escribir la página sucia en la memoria, posiblemente en otros momentos también. Esta solución permite que el sistema operativo administre E / S de disco por usted, y está en una mejor posición para hacerlo.

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