Является ли stdout когда-либо что-то кроме окна консоли? - PullRequest
6 голосов
/ 23 июня 2011

С http://www.cplusplus.com/reference/iostream/cout/:

По умолчанию в большинстве систем стандартный вывод выводится на консоль, где отображаются текстовые сообщения, хотя обычно это можно перенаправить.

Я никогда не слышал о системе, где stdout - это что-то, кроме окна консоли, по умолчанию или иным образом. Я вижу, как перенаправление может быть полезным в системах, где печать - дорогостоящая операция, но это не должно быть проблемой на современных компьютерах, верно?

Ответы [ 7 ]

14 голосов
/ 23 июня 2011

Конечно, это может быть.Я могу хотеть перенаправить стандарт в текстовый файл, другой процесс, сокет, что угодно.

По умолчанию это Консоль, но существует множество причин для ее перенаправления, наиболее полезной (в соответствии с философией Unix) является перенаправление вывода одной программы на вход другой программы.,Это позволяет создавать множество небольших и легких программ, которые взаимодействуют друг с другом и работают как отдельные части большой системы.

По сути, это простой, но мощный механизм для обмена данными.Он более популярен в системах * nix по той причине, о которой я упоминал выше, но также относится и к Windows.

8 голосов
/ 23 июня 2011

В большинстве систем вы можете перенаправить стандартный ввод / вывод / ошибку на другие файловые дескрипторы или места.

Например (в Unix):

./appname > output

Перенаправляет стандартный вывод из appname в файл с именем output.

./appname 2> errors > output

Перенаправляет stdout в файл с именем output, а все ошибки из stderr в файл с именем error.

В системах Unix вы также можете иметь программу, открывающую дескриптор файла и указывающую на stdin, например:

echo "input" > input
cat input | ./appname

Это приведет к чтению программы из канала для stdin.


Вот как в Unix вы можете "соединить" различные утилиты для создания одного более крупного инструмента.

find . -type f | ./appname | grep -iv "search"

Это запустит команду find, возьмет ее вывод и передаст ее в ./appname, затем вывод appname будет отправлен на ввод grep, который затем ищет слово «поиск» , отображая только результаты, которые соответствуют.

Позволяет многим небольшим утилитам иметь очень мощный эффект.


Подумайте о >, < и | как сантехника.

> похоже на сток в приемнике, он принимает данные и сохраняет их там, где вы хотите их разместить. Когда оболочка встречает >, она открывает файл.

> file

Когда оболочка увидит вышесказанное, она open будет использовать файл, используя стандартный системный вызов, и запомнит этот дескриптор файла. В приведенном выше случае, поскольку нет ввода, он создаст пустой файл и позволит вам вводить больше команд.

banner Hello

Эта команда пишет Hello в консоли большими буквами и заставляет ее прокручиваться (здесь я использую Unix, так как это то, что я знаю лучше всего). Вывод просто записывается в стандартный вывод. Используя «сток» (>), мы можем контролировать направление вывода, поэтому

banner Hello > bannerout

приведет к тому, что все данные из стандартного вывода баннера будут перенаправлены в дескриптор файла, открытый оболочкой, и, таким образом, будут записаны в файл с именем bannerout.

Трубы работают аналогично > в том, что они помогают контролировать поток данных. Однако каналы не могут записывать в файлы и могут использоваться только для того, чтобы поток данных переходил из одной точки в другую.

Например, вот вода, протекающая через несколько подстанций и очищающая отходы:

pump --from lake | treatment --cleanse-water | pump | reservoir | pump > glass

Вода течет из озера через трубу на водоочистную станцию, от установки обратно в насос, который перемещает ее в резервуар, затем снова закачивается в муниципальные водопроводные трубы и через вашу раковину в вашу стакан.

Обратите внимание, что трубы просто соединяют все выходы вместе, в конечном итоге это заканчивается в вашем стекле.

То же самое происходит с командами и их обработкой в ​​оболочке в Linux. Также следует путь к конечному результату.

Теперь есть одна заключительная вещь, которую я еще не обсуждал в моих предыдущих высказываниях, это < символ ввода. Что он делает, так это читает из файла и выводит его на стандартный ввод программ.

cat < bannerout

Просто распечатает то, что было сохранено в баннере. Это можно использовать, если у вас есть файл, который вы хотите обработать, но не хотите добавлять cat <file> из-за нежелания выполнять дополнительную команду в цепочке.

Так попробуйте это:

echo "Hello" > bannerinput
banner < bannerinput

Сначала будет помещена строка «Hello» в файл bannerinput, а затем, когда ваш баннер запуска будет прочитан из файла bannerinput.

Надеюсь, что это поможет вам понять, как перенаправление и отправка работает в Unix (некоторые, если не большинство, также применимы к Windows).

4 голосов
/ 23 июня 2011

До сих пор все ответы были в контексте вещи (оболочки, что угодно), которая вызывает программу.Сама программа может сделать stdout чем-то отличным от терминала.Стандартная библиотека C предоставляет freopen, что позволяет программисту перенаправлять стандартный вывод в любую совместимую среду.POSIX предоставляет ряд других механизмов (popen, fdopen, ...), которые дают программисту еще больше контроля.Я подозреваю, что Windows предоставляет аналогичные механизмы.

3 голосов
/ 23 июня 2011

Чтобы программа имела stdout, она должна работать в размещенной реализации (одна с операционной системой), или в автономной реализации с дополнительными функциями .

IМне трудно подобрать такую ​​реализацию без какой-либо консоли, но давайте на минутку предположим, что Mars Rover имеет полную ОС и запрограммирован на C (или C ++) и не имеет этой консоли

/* 2001-07-15: JPL: stdout is the headquarters */
puts("Help. I'm stuck.");

возможно, отправил сообщение в штаб-квартиру НАСА.

3 голосов
/ 23 июня 2011

С тремя стандартными файловыми дескрипторами 0, 1 и 2 может произойти любое количество вещей. Любой может запустить новый процесс с файловыми дескрипторами, прикрепленными к чему угодно.

Например, экран GNU помещаетвывод в канал и позволяет динамическое присоединение сеанса.SSH принимает вывод и возвращает его на другой конец.И, конечно же, все многочисленные перенаправители оболочки регулярно используют манипуляции с файловыми дескрипторами.

2 голосов
/ 23 июня 2011

Как Windows, так и Linux перенаправят stdout в файл, если вы запустите программу следующим образом:

my_program > some_file

Это наиболее распространенный случай, но многие другие типыперенаправление возможно.В Linux вы можете перенаправить stdout на все, что поддерживает интерфейс «дескриптор файла», например, канал, сокет, файл и другие вещи.

1 голос
/ 23 июня 2011

Один простой пример случая, когда можно перенаправить стандартный вывод, - при передаче информации в другую программу. Команда Unix / Linux ps создает список процессов, принадлежащих текущему пользователю. Если этот список был длинным и вы хотели найти конкретный процесс, вы можете ввести

ps | grep thing

, который перенаправил бы stdout из ps в stdin из grep thing.

...