LINUX.ORG.RU

Сообщения KnyazAndrey

 

Помогите разобраться с потоками

Форум — General

Всем привет! Совсем недавно начал знакомиться с Linux. Сейчас прохожу тему по потокам. Я вроде как понял, что нужно написать в командной строке, чтобы перенаправить вывод работы команды в файл или на вход другой команды и т. д., НО… До меня не очень доходит, как всё это в действительности работает. Я нарисовал себе следующую картину:

Есть какой-нибудь процесс (про процессы мало что знаю, ещё не дошёл до них), которому нужно принимать какие-то данные, обрабатывать их и отдавать результаты своей работы. Приём данных осуществляется через стандартный поток ввода (stdin), вывод результатов - через стандартный поток вывода (stdout). Насколько я понял, эти потоки есть ни что иное как файлы (ибо в Linux всё есть файл), откуда происходит считывание информации в случае с stdin и запись в файл в случае с stdout. Сами stdin, stdout неким образом (мне непонятно каким) по умолчанию связаны с клавиатурой и дисплеем соответственно. Но можно перенаправить данные потоки. Возьмём для примера перенаправление stdout в файл. В моей голове перенаправить значит отвязать stdout от дисплея и привязать его к какому-либо файлу. Как осуществляется это перепривязывание? И осуществляется ли оно вообще.

Есть вопрос по поводу выражения 2>&1. Как это понять? Т. е. на словах понятно, что происходит перенаправление стандартного потока ошибок на стандартный поток вывода. Но так сказать с технической точки зрения ничего непонятно. Попытаюсь объяснить, как я это понимаю.

Файл - именованная область данных на диске. Имя файла - указатель на данную область. При запуске процесса он (процесс) работает с файлами, которым присваиваются дескрипторы для идентификации файла в рамках работы данного процесса. Для stdin, stdout, stderr есть зарезервированные дескрипторы - 0, 1, 2 соответственно. Чтобы работать с этими файлами (stdin, stdout, stderr) используются их дескрипторы. Так вот, для меня строчка 2>&1 трактуется так: указатель stderr с дескриптором 2 перенаправить с дисплея на место, куда указывает указатель stdout (по умолчанию тоже дисплей, но не суть важно). Правильно? Думаю, нет. По крайней мере, звучит, как чепуха.

Ещё вопрос по выражению &> filename. Тяжело его понять. Хотя мне понятен смысл данной записи 1> filename 2>&1 (перенаправление stout, stderr в файл filename).

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

Подскажите, пожалуйста, прав я или нет. Исправьте, если надо. Правильно ли я понял, что стандартный поток ввода (stdin) и стандартный поток вывода (stdout) - файлы? Что значит перенаправить вывод/ввод процесса? Как именно осуществляется это перенаправление? В общем, помогите, пожалуйста, по возможности не вдаваясь в слишком глубокую теорию. Возможно, есть статьи, которые я не нашёл. Поделитесь, пожалуйста)))

 , , ,

KnyazAndrey
()

RSS подписка на новые темы