Как закрываются stdin, stdout, stderr

В большинстве современных языков программирования программистам не нужно Закрыть для stdin, stdout, stderr. Означает ли это, что операционная система будет обрабатывать закрытие stdin, stdout, stderr в целом?

Или, например, в java, jvm закроет stdin, stdout, stderr, когда запущена программа Java exit?

Могут быть исключения, такие как упомянутые некоторые старые программисты, поэтому я сужаю спектр языков только до Java, C, C++.

слишком широко, возможно, вам лучше выбрать одну ОС и один язык

largest_prime_is_463035818 20.03.2018 13:25

Библиотека C++ будет сбрасывать все, что эти потоки буферизовали, прежде чем программа обычно завершается. Процесс наследует базовые файлы, поэтому закрывать нечего, но технически операционная система освободит все ресурсы, используемые процессом, когда он завершится.

Sam Varshavchik 20.03.2018 13:26

@ user463035818 Готов поспорить, это не зависит от одного языка или ОС

Rui 20.03.2018 13:26

@SamVarshavchik Согласен с вашим :) Но лучше бы получить более авторизованный ответ

Rui 20.03.2018 13:27

Я уверен, что, по крайней мере, часть о том, что библиотека C++ очищает выходные потоки, похоронена где-то на 1400+ страницах, составляющих текущий стандарт C++. Но это такая мелочь, что, возможно, если вы объясните настоящую причину, по которой вам нужен «авторитетный ответ», то у кого-то может быть достаточно мотивации, чтобы найти ее.

Sam Varshavchik 20.03.2018 13:31

См. Пункт (2) en.cppreference.com/w/cpp/utility/program/exit

Richard Critten 20.03.2018 13:37

@Rui Ну, C и C++ отличаются от многих языков тем, что в особых случаях программист может закрыть их напрямую, вместо того, чтобы позволить родительскому процессу сделать это. Я не знаю другого языка, который позволяет это, но, вероятно, есть.

Galik 20.03.2018 13:38

Вам следует изучить другие языки, такие как LISP, BASIC, Pascal и Fortran, в которых нет stdin, stdout или stderr.

Thomas Matthews 20.03.2018 15:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
8
773
2

Ответы 2

Почти все программы работают в среде выполнения C, поэтому при нормальном завершении должны применяться правила функции C exit(). По 7.22.4.4 Функция exit из стандарт C:

Description

The exit function causes normal program termination to occur. No functions registered by the at_quick_exit function are called. If a program calls the exit function more than once, or calls the quick_exit function in addition to the exit function, the behavior is undefined.

First, all functions registered by the atexit function 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 the longjmp function 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 tmpfile function are removed.

Finally, control is returned to the host environment. If the value of status is zero or EXIT_SUCCESS, an implementation-defined form of the status successful termination is returned. If the value of status is EXIT_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. Пожалуйста, отредактируйте свой ответ.

Jonathan Leffler 20.03.2018 16:57

Другие вопросы по теме