Что происходит с ресурсами, которые не очищаются при использовании _exit в UNIX? - PullRequest
3 голосов
/ 01 сентября 2011

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

Каково влияние закрытия программы с _exit в зависимости от операционной среды и зачем вам ее использовать?

Ответы [ 3 ]

4 голосов
/ 01 сентября 2011

Нет разницы в ресурсах, освобождаемых при выходе с _exit по сравнению с exit, если вы не установили обработчики atexit.Именованные объекты общей памяти, ресурсы SysV IPC, файлы в файловой системе и т. Д. Не будут уничтожены ни при одном из типов выхода;память, выделенная для процесса (фактически, все пространство виртуальной памяти), файловые дескрипторы и т. д. будут уничтожены в любом случае.Подробнее см. Документацию в POSIX:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/_Exit.html

http://pubs.opengroup.org/onlinepubs/9699919799/functions/exit.html

Обычно единственным важным отличием является то, что объекты FILE stdio могут не сбрасываться (некоторые записи могутпотеряться), если вы используете _exit.

2 голосов
/ 01 сентября 2011

Ваша программа автоматически оснащена некоторыми обработчиками atexit() по умолчанию. Звоните exit() и

  • Потоки для файлов и каналов, которые все еще открыты, будут сброшены и закрыты.
  • Глобальные данные будут уничтожены.

Звоните _exit() и

  • Потоки для файлов и каналов, которые все еще открыты, не будут сброшены. Скорее всего, вы потеряете данные в выходных файлах.
  • Глобальные данные не будут уничтожены.

В обоих случаях

  • Любая выделенная память восстанавливается.
  • Закрытые дочерние процессы, которые вы не собрали, по-прежнему будут в таблице процессов (однако, зомби, похоже, не являются большой проблемой, которой они были давно.)
  • Все еще работающие дочерние процессы становятся сиротами и принимаются в процессе init.
2 голосов
/ 01 сентября 2011

Со страницы руководства:

exit:

Функция exit () сначала вызывает все функции, зарегистрированные atexit (3C), в обратном порядке их регистрации., за исключением того, что функция вызывается после любых ранее зарегистрированных функций, которые уже были вызваны во время ее регистрации.

_exit:

_Exit ()и функции _exit () функционально эквивалентны.Они не вызывают функции, зарегистрированные с помощью atexit (), не вызывают никаких зарегистрированных обработчиков сигналов и не очищают открытые потоки.

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

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