Какая очистка происходит в процессе после вызова exit () в C? - PullRequest
3 голосов
/ 07 января 2012

Если я вызываю exit () неявно:

int main(){
  return 0; /*exit(0) is being called */
}

или явно:

int main(){
  exit(0);
  return 0; /* this is never reached */
}

Конечная точка остается той же: exit () isбудучи призваннымТеперь, согласно некоторым источникам, exit () заставит процесс выполнить некоторую очистку перед передачей управления обратно в ОС.

Я знаю, что со временем ядро ​​(OS) собирается освободить все ресурсы.Так что же такого особенного в процессе очистки перед передачей управления ядру?Что такое эта очистка ?Почему это необходимо?Как процесс узнает, что очистить ?

Ответы [ 3 ]

4 голосов
/ 07 января 2012

Библиотека времени выполнения C поддерживает запуск кода пользователя при выходе из процесса, установленного с помощью функции <a href="http://pubs.opengroup.org/onlinepubs/009695399/functions/atexit.html" rel="nofollow">atexit()</a>.Это не то, о чем знает базовая операционная система, поэтому код в exit() должен реализовывать это, например.

4 голосов
/ 07 января 2012

Как всегда, этот вопрос может быть решен со ссылкой на спецификацию C (N1256).7.20.4.3 Дает это определение для exit():


3. Сначала вызываются все функции, зарегистрированные функцией atexit, в обратном порядке их регистрации, кромечто функция вызывается после любых ранее зарегистрированных функций, которые уже были вызваны во время ее регистрации.Если во время вызова любой такой функции будет выполнен вызов функции longjmp, которая прервет вызов зарегистрированной функции, поведение не определено.

4. Далеевсе открытые потоки с неписанными буферизованными данными сбрасываются, все открытые потоки закрываются и все файлы, созданные функцией tmpfile, удаляются.

5. Наконец, управление возвращаетсясреда хоста.Если значение статуса равно нулю или EXIT_SUCCESS,, возвращается определяемая реализацией форма успешного завершения статуса.Если значение статуса равно EXIT_FAILURE,, возвращается определяемая реализацией форма неудачного завершения статуса.В противном случае возвращаемый статус определяется реализацией.


Или на английском языке:

Первый вызов всех зарегистрированных atexit функций.Далее очистите все неписанные буферизованные данные.Далее закройте открытые потоки.Наконец, верните статус выхода и управление в ОС.

0 голосов
/ 07 января 2012

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

...