Tengo un programa en modo consola que usa SQLite3 para mantener un archivo de base de datos. Se tarda un tiempo en ejecutarse, pero debería ser seguro cancelarlo en cualquier momento, suponiendo que ocurra la escritura de la base de datos. (Esto es todo bajo Windows)TerminateProcess vs Ctrl + C
¿Es más seguro, desde el punto de un programa en ejecución, para golpear CtrlC en la consola de tener otro TerminateProcess llamada del programa en él?
Me he dado cuenta de que puedo dañar la base de datos si se invoca TerminateProcess, supongo que es porque el programa no tiene la posibilidad de finalizar las escrituras. Supongo que CtrlC es mejor, porque el programa recibe una señal y se termina a sí mismo, en lugar de que el sistema operativo lo mate.
Tenga en cuenta que el programa no maneja la señal (a menos que SQLite lo haga); Estoy hablando de los mecanismos predeterminados incorporados de los ejecutables Win32 para manejar la señal CtrlC.
Aclarar/simplificar el cuestionable dado que esta escritura solo ha ejecutado:
fwrite(buf, 1024*1024, 1, stream);
Durante esta escritura, se TerminateProcess comportamiento diferente del de CtrlC?
Muy interesante, supongo que la operación IO se completa independientemente, ya que simplemente no tiene sentido detenerla, ¿qué podría hacer sino conducir a la corrupción? Debe ser otra forma de bloquear TerminateProcess oculto en algún lugar. Cosas interesantes. Gracias. – Gavin
Sospecho que TerminateProcess no puede matar el proceso de forma segura mientras realiza un syscall: el contexto del subproceso en esa etapa se encuentra en el espacio del kernel, y al matarlo a la fuerza puede haber pérdidas de recursos del sistema. El sistema operativo probablemente instala ganchos para todos los hilos del proceso que se están ejecutando actualmente en el espacio del kernel, lo que mata al hilo cuando intenta regresar de syscall. – pmdj