Вопрос

Я перегрузил 6 сигналов, перечисленных на этом сайте. http://www.cplusplus.com/reference/clibrary/csignal/signal.html

Затем я запустил свое приложение (двойной щелчок не запускался через IDE) и попробовал 1) завершить задачу 2) X вверху справа и 3) убить процесс.Я ожидал, что первые два вызовут какой-то сигнал (я использую XP), но, увы, ничего не получил.Разве мне не разрешено открывать файлы для записи при возникновении сигнала?Я предполагаю, что да (SIGSEGV позволил мне).

Когда Firefox выходит из строя или когда я его убиваю, он запоминает, на каких страницах я был.Записывается ли он адрес каждый раз, когда я нажимаю на страницу, или он делает это при сигнале/сбое?

мой главный вопрос: какой сигнал я могу использовать, чтобы поймать процесс уничтожения

Это было полезно?

Решение

Win32 не предоставляет возможности перехватить уничтожение вашей программы с помощью TerminateProcess (именно это произойдет, если вы «Завершите задачу» в диспетчере задач или нажмете [X]).

Вы можете поймать сигнал SIGSEGV, поскольку библиотека времени выполнения C обеспечивает эмуляцию этого сигнала при работе в Windows.Когда ваша программа вызывает нарушение прав доступа Windows (исключение 0xC0000005), библиотека времени выполнения имеет возможность отследить это и смоделировать для вас SIGSEGV в стиле Unix.Однако это не лучший способ обработки такого исключения.Если вы пишете программу Win32, вам, как правило, не следует пытаться использовать службы стиля Unix.

Другие советы

Вы можете обнаружить ошибку времени выполнения, например нарушение прав доступа, если переопределить обработчик исключений по умолчанию, вызывающий SetUnhandledExceptionFilter (это функция win32, поэтому она не зависит от эмуляции библиотеки C).Этот метод можно использовать для создания «минидампов» при сбое программы.

Но этот обработчик исключений не будет вызываться, когда вы обычно закрываете приложение или когда ваше приложение закрывается из диспетчера задач.В последнем случае Windows вызывает TerminateProcess, это не полное завершение работы, а принудительное завершение вашей программы.

Я не знаю, какая реализация используется Firefox, но для сохранения текущих открытых вкладок, скорее всего, будет работать таймер, и каждый раз, когда он запускается, он сохраняет историю в файл и какую-то грязную отметку.

Другие, более сложные решения для обнаружения закрытия программы (реализуемые антивирусными и аналогичными программами) заключаются в запуске двух несвязанных программ, каждая из которых проверяет, что другая все еще работает, и, если одна обнаруживает, что другая закрыта, запускает ее снова.

Приложения для Windows — это либо консольные приложения, либо приложения с графическим интерфейсом.Консольные приложения обычно получают WM_CLOSE, консольные приложения — CTRL_CLOSE_EVENT.Это не сигналы;ни один из них не будет отправлен, если ваше приложение завершится с помощью TerminateProcess().

Если вы хотите сохранить, где вы были, используйте файл, отображенный в памяти, и обновляйте его при каждом действии.Когда ваш процесс завершается, грязная страница в памяти записывается обратно в файл операционной системой, возможно, и в другие моменты.Это решение позволяет ОС управлять дисковым вводом-выводом за вас, и она находится в лучшем положении для этого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top