В чем разница между exit и _exit в libc.so? - PullRequest
0 голосов
/ 07 апреля 2011
(gdb) info symbol exit
exit in section .text of /lib64/libc.so.6
(gdb) info symbol _exit
_exit in section .text of /lib64/libc.so.6

Кто-нибудь знает?

1 Ответ

3 голосов
/ 23 января 2012

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

Из руководства glibc по адресу http://www.gnu.org/software/libc/manual/html_mono/libc.html (также ознакомьтесь с исходным кодом glibc для получения подробной информации.):

25.6.1 Нормальное завершение

Процесс нормально завершается, когда его программа сигнализирует об этом, вызывая exit.Возвращение из main эквивалентно вызову exit, и значение, которое возвращает main, используется в качестве аргумента для выхода.

- Функция: void exit (int status)

Функция выхода сообщает системечто программа завершена, что приводит к ее завершению.

status - это состояние завершения программы, которое становится частью статуса завершения процесса.Эта функция не возвращает.

Обычное завершение вызывает следующие действия:

Функции, которые были зарегистрированы с помощью функций atexit или on_exit, вызываются в обратном порядке их регистрации.Этот механизм позволяет вашему приложению указывать свои собственные действия по «очистке», которые будут выполняться при завершении программы.Обычно это используется для сохранения информации о состоянии программы в файле или разблокировки блокировок в общих базах данных.

Все открытые потоки закрываются, записывая любые буферизованные выходные данные.Смотрите Закрытие потоков.Кроме того, удаляются временные файлы, открытые с помощью функции tmpfile;см. Временные файлы.

_exit вызывается, завершая программу.См. Внутренние элементы завершения.

И в разделе «Внутренние элементы завершения»:

25.6.5 Внутренние элементы завершения

Функция _exit является примитивом, используемым для процесса.прекращение при выходе.Он объявлен в заголовочном файле unistd.h.

- Функция: void _exit (int status)

Функция _exit является примитивом для завершения процесса с состоянием статуса.Вызов этой функции не выполняет функции очистки, зарегистрированные с помощью atexit или on_exit.

...