В большинстве современных языков программирования программистам не нужно Закрыть для stdin, stdout, stderr. Означает ли это, что операционная система будет обрабатывать закрытие stdin, stdout, stderr в целом?
Или, например, в java, jvm закроет stdin, stdout, stderr, когда запущена программа Java exit?
Могут быть исключения, такие как упомянутые некоторые старые программисты, поэтому я сужаю спектр языков только до Java, C, C++.
Библиотека C++ будет сбрасывать все, что эти потоки буферизовали, прежде чем программа обычно завершается. Процесс наследует базовые файлы, поэтому закрывать нечего, но технически операционная система освободит все ресурсы, используемые процессом, когда он завершится.
@ user463035818 Готов поспорить, это не зависит от одного языка или ОС
@SamVarshavchik Согласен с вашим :) Но лучше бы получить более авторизованный ответ
Я уверен, что, по крайней мере, часть о том, что библиотека C++ очищает выходные потоки, похоронена где-то на 1400+ страницах, составляющих текущий стандарт C++. Но это такая мелочь, что, возможно, если вы объясните настоящую причину, по которой вам нужен «авторитетный ответ», то у кого-то может быть достаточно мотивации, чтобы найти ее.
См. Пункт (2) en.cppreference.com/w/cpp/utility/program/exit
@Rui Ну, C и C++ отличаются от многих языков тем, что в особых случаях программист может закрыть их напрямую, вместо того, чтобы позволить родительскому процессу сделать это. Я не знаю другого языка, который позволяет это, но, вероятно, есть.
Вам следует изучить другие языки, такие как LISP, BASIC, Pascal и Fortran, в которых нет stdin, stdout или stderr.




Почти все программы работают в среде выполнения C, поэтому при нормальном завершении должны применяться правила функции C exit(). По 7.22.4.4 Функция exit из стандарт C:
Description
The
exitfunction causes normal program termination to occur. No functions registered by theat_quick_exitfunction are called. If a program calls theexitfunction more than once, or calls thequick_exitfunction in addition to theexitfunction, the behavior is undefined.First, all functions registered by the
atexitfunction are called, in the reverse order of their registration, except that a function is called after any previously registered functions that had already been called at the time it was registered. If, during the call to any such function, a call to thelongjmpfunction is made that would terminate the call to the registered function, the behavior is undefined.Next, all open streams with unwritten buffered data are flushed, all open streams are closed, and all files created by the
tmpfilefunction are removed.Finally, control is returned to the host environment. If the value of
statusis zero orEXIT_SUCCESS, an implementation-defined form of the status successful termination is returned. If the value ofstatusisEXIT_FAILURE, an implementation-defined form of the status unsuccessful termination is returned. Otherwise the status returned is implementation-defined.
Для любого процесса, который не работает в среде выполнения C, соответствующей стандартам, то, что происходит при завершении процесса, будет определяться реализацией.
Ваш вопрос очень специфичен для системы. Прежде всего, эти термины имеют несколько значений. Возьмем конкретные примеры евнухов-вариантов. Здесь каждый процесс является копией родительского процесса. Оболочки обычно устанавливают номера файлов 0, 1 и 2 для дочернего процесса при его запуске.
Эти «файлы» называются stdin, stdout и stderr.
Программисты на C имеют два уровня библиотек. В вариантах евнухов вы можете получить доступ к системным службам, таким как чтение или запись, которые работают с идеей файла. Кроме того, стандартная библиотека C имеет наложенные на них функции (например, fread и fwrite), которые выполняют буфер. Он также определяет символы stdin, stout и stderr, которые, ссылаясь на структуру, служат аргументами для функции f_____ file. Где-то в этих структурах встроен номер файла.
Итак, просто в стране евнухов на ваш вопрос есть два ответа в зависимости от того, имеете ли вы в виду stdio et al. как номера файлов или как символы, созданные библиотекой c?
Если вы имеете в виду символы библиотеки, библиотека должна быть настроена на обработку выхода из программы для очистки буфера.
Если вы имеете в виду номера файлов, это должно обрабатываться операционной системой.
Использование «евнухов» в этом контексте неуместно в ответе на SO. Пожалуйста, отредактируйте свой ответ.
слишком широко, возможно, вам лучше выбрать одну ОС и один язык