Как правильно заставить приложение сбросить память и выйти из нее? - PullRequest
6 голосов
/ 13 апреля 2011

Я только что наткнулся на некоторый код, который использовал системный вызов kill для отправки сигнала SIGSEGV в приложение.Основанием для этого было то, что это заставило бы приложение выполнить дамп ядра и выйти.Мне это кажется неправильным, это нормальная практика?

Ответы [ 5 ]

8 голосов
/ 13 апреля 2011

SIGQUIT - правильный сигнал для отправки в программу, если вы хотите произвести дамп ядра.kill - это правильная программа командной строки для отправки сигналов (она, конечно, имеет неправильное название, поскольку не все сигналы будут убивать программу).

Обратите внимание, что не следует отправлять в программу случайные сигналы, а не всеиз них будет производить основной дамп.Многие из них будут обрабатываться самой программой, либо потребляться, игнорироваться, либо вызывать другую обработку.Таким образом, отправка SIGSEGV неверна.


GCC говорит: http://www.gnu.org/s/libc/manual/html_node/Termination-Signals.html

POSIX / Unix говорит: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/signal.h.html

6 голосов
/ 13 апреля 2011

Да.kill несколько неверно названо - может послать любой сигнал.Существует много вариантов использования kill, которые вообще не приводят к остановке процесса!

3 голосов
/ 13 апреля 2011

Способ сделать это в Unix / Linux - вызвать abort (), которая отправит SIGABORT текущему процессу. Другим вариантом является повышение (), где вы можете указать, какой сигнал вы хотите отправить текущему процессу.

3 голосов
/ 13 апреля 2011

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

Если вы хотите сбросить ядро ​​из приложения, есть более приятные способы сделать это, например, черезassert ().

Таким образом, нет, не особенно неправильно отправлять SEGV в программу.Вы также можете отправить такие вещи, как SIGILL для недопустимой инструкции или сигнал деления на ноль.Все хорошо.

0 голосов
/ 13 апреля 2011

Ричард Стивенс (_Современное программирование в среде UNIX) писал:

Генерация ядра - это особенности реализации большинства Unix. Он не является частью POSIX.1.

Он перечисляет 12 сигналов, действие по умолчанию которых заканчивается на ядре (ANSI: SIGABRT, SIGFPE, SIGILL, SIGSEGV, POSIX: SIGQUIT, Другое: SIGBUS, SIGEMT, SIGIOT, SIGSYS, SIGTRAP, SIGXCPU, SIGXFSZ), все они перезаписываются (два не перезаписываемых сигнала - SIGKILL и SIGSTOP).

Я никогда не видел способа генерирования ядра, в котором не используется обработчик сигналов по умолчанию.

Таким образом, если ваша цель - сгенерировать ядро ​​и остановиться, лучше всего выбрать сигнал, чей обработчик по умолчанию выполняет работу (SIGSEGV выполняет работу), сбросить обработчик по умолчанию для сигнала, если вы его используете, и затем использовать убить.

...