У меня есть консольный режим, который использует SQLite3 для ведения файла базы данных. Требуется некоторое время для выполнения, но в любой момент должно быть безопасно отменять, предполагая, что происходит запись базы данных. (Это все под Windows)TerminateProcess vs Ctrl + C
Это безопаснее, с точки выполнения программы, чтобы ударить CtrlC в консоли, чем иметь другой TerminateProcess вызова программы на нем?
Я заметил, что я могу получить повреждение базы данных, если TerminateProcess вызывается - я предполагаю, что это потому, что у программы нет возможности закончить запись. Я предполагаю, что CtrlC лучше, потому что программа получает сигнал и завершает себя, а не ОС, убивая его.
Обратите внимание, что программа фактически не обрабатывает сигнал (если только SQLite не делает); Я говорю о встроенных механизмах по умолчанию для исполняемых файлов Win32 для обработки CtrlC сигнал.
Для уточнения/упрощения Вопрос-, учитывая, что это запись только выполняется:
fwrite(buf, 1024*1024, 1, stream);
Во время этой записи, будет TerminateProcess вести себя иначе CtrlC?
Очень интересно, я полагаю, что операция ввода-вывода завершается независимо, так как просто не имеет смысла ее останавливать, что бы она могла сделать, кроме как привести к коррупции. Должен быть другой способ блокировки TerminateProcess, скрытый где-то. Интересный материал. Благодарю. – Gavin
Я подозреваю, что TerminateProcess не может безопасно убить процесс во время выполнения syscall: контекст потока на этом этапе находится в пространстве ядра, и принудительное его уничтожение может привести к утечке системных ресурсов. OS, возможно, устанавливает крючки для всех потоков процесса, выполняемых в настоящее время в пространстве ядра, которые убивают поток, когда он пытается вернуться из системного вызова. – pmdj