2011-01-27 1 views
0

Когда я поймаю сигнал SIGINT в своей программе, как я могу безопасно очищать ресурсы? В функции обработчика сигнала нельзя вызвать оператора delete, потому что я не знаю, как освободить ресурс, созданный с помощью оператора new.Как бороться с SIGINT?

Любые идеи?

+0

Дополнительная информация и пример кода здесь: http://stackoverflow.com/questions/4250013/is-destructor-called-if-sigint-or-sigstp-issued –

+0

Что вы имеете в виду, что нельзя вызвать 'delete '? –

+1

Поскольку SIGINT может происходить асинхронно, во время задачи управления памятью, а куча может быть непоследовательной? Что происходит, когда 'delete' вызывается обработчиком сигнала, который прерывает вызов' new'? –

ответ

1

Если ваше приложение закрывается, не беспокойтесь о памяти. В любом случае ОС собирается выбросить все, как только вы закончите.

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

+2

IIRC, ОС очищает все, что имеет идентификатор файла (например, файлы или сокеты). Однако он не очищает общую память, семафоры и другие конструкции IPC. –

+0

Правильно, os вернет память, но она просто освободит память, а не вызовет моего деструктора, который пишет некоторую информацию в мой журнал и закрывает журнал. – PDF1001

1

Как правило, вы не хотите делать вообще ничего в своем обработчике сигнала, кроме как установить логический флаг, на который будет реагировать какая-то другая часть вашей программы, что обычно приводит к прохождению некоторых циклов и позволяет использовать привычный подход для упорядоченного выключения, которое вы будете использовать в случаях, не связанных с сигналами. Причина использования этого флага для координации выключения заключается в том, что некоторые функции библиотеки избегают компромиссов, необходимых для безопасного повторного ввода во время обработки сигнала асинхронного сигнала. Даже некоторые поточно-безопасные функции с использованием потоковой памяти могут не справиться с повторной активацией async. Быстрый поиск нашел некоторое обсуждение безопасных функций на http://book.chinaunix.net/special/ebook/addisonWesley/APUE2/0201433079/ch10lev1sec6.html#ch10lev1sec6.

+0

На самом деле я пытаюсь установить булевский флаг, как описано в Tony. Но кажется, что все потоки остановились в этом процессе, и я не знаю, где проверить этот флаг, чтобы процесс завершался. Нет основной записи для моего кода. библиотека linux – PDF1001

+0

@ PDF1001: возможно, вам следует оставить обработку сигналов приложениям - это необычно для библиотеки, чтобы взять ее на себя и не очень хорошо масштабировать (то есть, насколько хорошо ваша библиотека справится, если какая-то другая библиотека также пытается обрабатывать SIGINT и запускать завершение работы приложения?). –

Смежные вопросы