Есть ли гарантия автоматического выключения stdout перед выходом? Как это работает?
Вот код (действительный C и С++)
#include <stdio.h>
int main() {
printf("asfd");
// LINE 1
return 0;
}
Если в строке 1 я поставлю segfaulting выражение, программа просто потерпит крах без печати ничего (как и ожидалось).
Но почему вышеприведенный код печатает "asdf" и не выходит из буфера без сброса? Что находится под капотом и почему оно работает должным образом?
Ответы
Ответ 1
Это выполняется этими двумя разделами в спецификации языка С++:
[basic.start.main]
Оператор return в main
имеет функцию выхода из основной функции и вызова exit
с возвращаемым значением в качестве аргумента.
и
[lib.support.start.term]
Функция exit
имеет дополнительное поведение в этом международном стандарте:
- ...
- Затем все открытые потоки C с ненаписанными буферизованными данными будут сброшены.
- ...
Ответ 2
Как правило, возврат из main
не является завершением вашей программы и не является входом в main
начало.
Обычно компоновщик, который создает окончательный исполняемый файл для вашей программы, отмечает место, возможно, названное start
, в качестве места начала выполнения. Когда операционная система загружает вашу программу и начинает ее выполнять, она запускает выполнение в этом месте. Там есть код, который устанавливает среду: создает стек, устанавливает состояния потоков и т.д. Затем этот код вызывает main
.
Когда возвращается main
, он возвращается к этому специальному коду. Затем этот код выполняет различную работу по очистке, которая требуется в конце программы на C или С++, как описано в этом ответе.
Если программа завершается внезапно, этот окончательный код может не выполняться.
Ответ 3
Когда main()
завершается, все открытые потоки закрываются... для включения stdout
. Закрытие открытого потока flushes stdout
и то, что вы написали в буфер, передается с новой линией или без нее.