Ответ 1
Среда выполнения C будет регистрировать обработчики atexit()
для сброса стандартных буферов при вызове exit()
.
См. описание .
Мне интересно узнать, как работает функция flash printf()
, когда программа завершает работу.
Возьмем следующий код:
int main(int ac, char **av)
{
printf("Hi");
return 0;
}
В этом случае, как printf()
удается сбросить свой буфер до stdout
?
Я думаю, что это зависит от платформы, поэтому пусть Linux.
Он может быть реализован с помощью gcc
__attribute__((dtor))
, но тогда стандартная библиотека будет зависимой от компилятора. Я предполагаю, что это не так, как это работает.
Любые объяснения или ссылки на документацию приветствуются. Спасибо.
Среда выполнения C будет регистрировать обработчики atexit()
для сброса стандартных буферов при вызове exit()
.
См. описание .
Когда программа выходит из строя, функция exit
всегда выполняла чистое закрытие стандартной библиотеки ввода-вывода, что приводит к покраске всех буферизованных выходных данных.
Возвращение целочисленного значения из основной функции эквивалентно вызову exit с тем же значением. Таким образом, return 0
имеет тот же эффект с exit(0)
Если вызывается _Exit
или _Exit
, процесс будет немедленно прекращен, IO не будет очищен.
Просто для того, чтобы расширить ответ trofanjoe:
выход вызывает нормальное завершение программы. Функции atexit вызываются в обратный порядок регистрации, открытые файлы сбрасываются, открытые потоки закрыты, а управление возвращается в среду.
и
Внутри main return expr эквивалентен exit (expr). выход имеет преимущество в том, что его можно вызывать из других функций
От man stdio
на моей машине здесь (выделено мной), который запускает RHEL 5.8:
Затем файл может быть повторно открыт тем же или другим выполнение программы и ее содержимое исправлено или изменено (если оно может быть перемещенными в начале). Если основная функция возвращается к своей исходный вызывающий объект или функция выхода (3), все открытые файлы закрыты (следовательно, все выходные потоки сбрасываются) перед программой завершение. Другие способы завершения программы, такие как прерывание (3) не заботьтесь о закрытии файлов.