Стандартные потоки и каналы: часть 2



Перед тем как перейти к каналам, нужно поговорить про стандартные потоки ввода/вывода. Стандартные потоки — это механизмы, которые позволяют программам взаимодействовать с внешним окружением через операции чтения и записи данных, минуя необходимость прямого обращения к файлам на диске. Такой вид взаимодействия осуществляется с помощью файловых дескрипторов, аналогично управлению файлами в файловой системе. 📁



При создании любого нового процесса операционная система автоматически настраивает для него три стандартных потока: стандартный ввод (STDIN), стандартный вывод (STDOUT) и стандартный поток ошибок (STDERR). Каждый из этих потоков соответствует определённому файловому дескриптору и предоставляет интерфейс потока данных, позволяющий выполнить чтение или запись. 📥📤



Стандартный ввод (STDIN) используется программами для чтения данных, введённых пользователем или перенаправленных из других источников. Стандартный вывод (STDOUT) и поток ошибок (STDERR) используются для вывода результата выполнения программ и сообщений об ошибках соответственно. Эти потоки фактически являются каналами, по которым процесс может получать и отправлять данные внешнему миру. Канал можно определить как механизм межпроцессного взаимодействия, который работает в пределах одной операционной системы на одном компьютере. 🌐



Но что, если программа хочет получать свой ввод (STDIN) из вывода (STDOUT) другой программы? Операционная система может перенаправить вывод одного процесса во ввод другого. Для этого используются такие механизмы, как pipe (конвейеры), которые позволяют передавать данные напрямую между процессами через их стандартные потоки. 📡



Пример использования pipe в Bash:



ps aux | grep bash




Это сценарий на языке командной оболочки Bash. Мы создаем два процесса: первый для программы `ps`, чтобы вывести список всех запущенных процессов системы, причем результат своей работы ps выводит в свой STDOUT (канал). А другой, для grep, который принимает данные через свой STDIN (канал), затем фильтрует и записывает результат в свой STDOUT (канал). И дальше в дело вступает оператор |, который создает конвейер.

Фактически, это вызов системной функции ОС pipe, которая позволяет перенаправлять данные из STDOUT одного процесса в STDIN другого, обеспечивая таким образом совместную и согласованную работу разных процессов, написанных на разных языках программирования. Применение этого механизма в командной оболочке облегчает создание мощных композиций из различных программ. 🖥



Надеюсь, мой пост был для тебя полезен. Если хочешь углубить свои знания в области практического использования каналов между процессами и эффективного использования командной оболочки, то предлагаю ознакомиться с моим мини-курсом «Командная оболочка Linux для разработчика». 👨‍💻



🔗 смотреть курс