LINUX.ORG.RU

Разница между abort() и exit(EXIT_FAILURE)?


0

0

В "Linux Programmer's Manual" написано:

Функция abort() вызывает ненормальное завершение программы.
Функция exit(status) вызывает нормальное завершение программы. По стандарту C status может быть константой EXIT_SUCCESS или EXIT_FAILURE, которые означают успешное и неуспешное завершение программы.

Я не понимаю? в чём принципиальная разница между abort() и exit(EXIT_FAILURE), ведь обе функции сообщают ОС о неудачном завершении работы программы?

В тем что
1)при exit(EXIT_FAILURE) твоя программа просто завершится, а при abort напишется ненормальное завершение и все дела.
2)написано что все потоки будут закрты, а при exit не только нормально освобождаются файловые дескрипторы, но и другие ресурсы.
3)логическое различие, я думаю разница между аварийным завершением и выходом с возвращением кода ошибки очевидна

anonymous
()

abort() вызывает сигнал SIGABRT. Обработчик сигнала по умолчанию вызывает exit(EXIT_FAILURE). Если обработчик блокирован или игнорируется, то abort() его перекрывает на умолчательный.

exit(someinteger) просто "аккуратно" завершает программу и возвращает "someinteger". Для совместимости с некоторыми не-ПОЗИКС системами имеется макро EXIT_FAILURE (оно не 0, и всего-то).

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

Да, вдогонку --

"нормальное" и "не нормальное" завершение лишь терминологическая дань традиции.

_Принято_, что отличный от 0 код возврата говорит о ненормальном завершении.

Статус возврата, который получает папа процесса, грубо говоря, состоит из 2 частей. В одной будет то, что вернул exit(), а в другой будет информация о сигнале, который убил процесс. Поскольку abort() вызывает сигнал, то код возврата будет ненулевым.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

При abort'е не происходит много нужных вещей - не вызываются функции, установленные с atexit, не сбрасываются корректно буфера от stdio, наконец, обычно при abort пишется coredump. Короче abort он аборт и есть .

anonymous
()
Ответ на: комментарий от anonymous

2anonymous (*) (29.05.2005 23:52:07):

> При abort'е не происходит много нужных вещей - не вызываются функции, установленные с atexit, не сбрасываются корректно буфера от stdio, наконец, обычно при abort пишется coredump. Короче abort он аборт и есть .

Да нет, функции, установленные с atexit, действительно, не вызываются, но буфера от stdio должны чиститься.

abort() делает так (Линукс-специфик вариант):

Сначала жужжит на предмет повторных входов в себя (ставит локи и счетчики).

Потом делает fflush всем открытым стримам.

Потом поднимает сигнал SIGABRT.

Если вернулась, то убирает предыдущий обработчик, закрывает стримы и снова вызывает SIGABRT.

Если и тут возвращается, то далее пытается умереть всеми силами.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

Да, вдогонку:

Обработчик по умолчанию, действительно, сбрасывает core и вызывает не exit(EXIT_FAILURE), а _exit(EXIT_FAILURE).

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.