сигнал, когда пользователь убивает процесс? - PullRequest
3 голосов
/ 27 января 2009

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 27 января 2009

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

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

1 голос
/ 27 января 2009

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

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

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

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

0 голосов
/ 27 января 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...