Printf flush при выходе программы

Мне интересно узнать, как работает функция flash printf(), когда программа завершает работу.

Возьмем следующий код:

int main(int ac, char **av)
{
    printf("Hi");
    return 0;
}

В этом случае, как printf() удается сбросить свой буфер до stdout?

Я думаю, что это зависит от платформы, поэтому пусть Linux.

Он может быть реализован с помощью gcc __attribute__((dtor)), но тогда стандартная библиотека будет зависимой от компилятора. Я предполагаю, что это не так, как это работает.

Любые объяснения или ссылки на документацию приветствуются. Спасибо.

Ответ 1

Среда выполнения C будет регистрировать обработчики atexit() для сброса стандартных буферов при вызове exit().

См. описание .

Ответ 2

Когда программа выходит из строя, функция exit всегда выполняла чистое закрытие стандартной библиотеки ввода-вывода, что приводит к покраске всех буферизованных выходных данных.

Возвращение целочисленного значения из основной функции эквивалентно вызову exit с тем же значением. Таким образом, return 0 имеет тот же эффект с exit(0)

Если вызывается _Exit или _Exit, процесс будет немедленно прекращен, IO не будет очищен.

Ответ 3

Просто для того, чтобы расширить ответ trofanjoe:

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

и

Внутри main return expr эквивалентен exit (expr). выход имеет преимущество в том, что его можно вызывать из других функций

Ответ 4

От man stdio на моей машине здесь (выделено мной), который запускает RHEL 5.8:

Затем файл может быть повторно открыт тем же или другим выполнение программы и ее содержимое исправлено или изменено (если оно может быть перемещенными в начале). Если основная функция возвращается к своей исходный вызывающий объект или функция выхода (3), все открытые файлы закрыты (следовательно, все выходные потоки сбрасываются) перед программой завершение. Другие способы завершения программы, такие как прерывание (3) не заботьтесь о закрытии файлов.