Существуют ли «нестандартные» потоки в Linux/Unix?

Существуют ли «нестандартные» потоки в Linux/Unix?

Так называемые "стандартные потоки" в Linux — это stdin, stdout и stderr. Они должны называться "стандартными" не просто так. Существуют ли нестандартные потоки? Являются ли эти нестандартные потоки принципиально иными в ядре?

решение1

В этом контексте «поток» — это открытый файл в процессе. (Слово «поток» может иметь и другие значения, которые здесь не по теме.)

Три стандартных потока — это те, которые должны быть уже открыты при запуске программы. Файловый дескриптор 0 называется стандартным вводом, потому что именно здесь программа должна считывать пользовательский ввод или ввод данных по умолчанию. Файловый дескриптор 1 называется стандартным выводом, потому что именно здесь программа должна записывать свои обычные выходные данные. Файловый дескриптор 2 называется стандартной ошибкой, потому что именно здесь программа должна записывать свои сообщения об ошибках.

Другие номера дескрипторов файлов не являются стандартными, поскольку у них нет такой предопределенной роли. Они в конечном итоге будут использоваться для всего, что захочет программа. Так что можно было бы назвать любой файл, открытый программой, «нестандартным потоком», но это было бы странно и запутанно: «открыть файл, отличный от stdin, stdout или stderr» на самом деле не нуждается в имени, а «нестандартный поток» звучит так, будто это какой-то особый тип файла или файл, открытый нестандартным методом, что не так.

Обычная роль файловых дескрипторов 0–2 предоставляется стандартной библиотекой и некоторыми программами. Например, консольные программы входа и эмуляторы терминала запускают оболочку (или другую программу) с открытым на этих файловых дескрипторах терминала. Стандартная библиотека C создает FILE*объекты (то, что C называет потоками) для этих трех стандартных дескрипторов. В ядре нет специальной обработки.

решение2

Ядро обрабатывает все файловые дескрипторы одинаково. Это просто соглашение, чтобы были процессы, которые используют файловый дескриптор 0 в качестве ввода (stdin), файловый дескриптор 1 в качестве вывода (stdout) и печатают ошибки в файловом дескрипторе 2 (stderr).

Когда запускается ваш терминал, он создает псевдо-tty и запускает оболочку с вводами/выводами, назначенными файловым дескрипторам 0, 1 и 2. Затем, если ваша программа не использует это соглашение, вам придется перенаправить вводы и/или выводы соответствующим образом.

Связанный контент