Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Зачет по UNIX.docx
Скачиваний:
7
Добавлен:
02.08.2019
Размер:
50.16 Кб
Скачать

7. Стандартные потоки, операторы перенаправления потоков, подстановка команд

Потоки ввода-вывода

В UNIX-системах широко используется концепция потока. Поток это буферизованный обмен данными. Проще выражаясь, при обмене данными (например, между клавиатурой и прикладной программой) посредством потока, данные не передаются напрямую в программу в момент их прибытия, а помещаются в выделенный для этого блок (буфер) памяти. Затем, программа, работающая с потоком, в "удобный" момент считывает данные из буфера. Таким образом у программиста нет необходимости синхронизировать поступление данных и их обработку.

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

Для каждого запущенного в Unix процесса, существует три специальных потока, с которыми ассоциированы специальные дескрипторы. Это стандартный поток ввода (дескриптор 0), вывода (1) и ошибок (2). Поток ввода доступен только для чтения, потоки вывода и ошибок — только для записи. По-умолчанию, данные считанные из стандартного потока ввода (дескриптор 0), считываются с клавиатуры. Данные, записанные в потоки вывода и ошибок, выводятся в терминал, ассоциированный с процессом (обычно терминал, из которого процесс был запущен). При этом данные потока ошибок выводятся немедленно, в то время как для данных потока вывода возможны задержки при выводе (система выводит эти данные "когда удобно").

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

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

Стандартные потоки привязаны к файловым дескрипторам с номерами 0, 1 и 2.

Стандартный поток ввода (stdin) — 0;

Стандартный поток вывода (stdout) — 1;

Стандартный поток ошибок (stderr) — 2.

Вывод данных на экран и чтение их с клавиатуры происходит потому, что по умолчанию стандартные потоки ассоциированы с терминалом пользователя. Это не является обязательным — потоки можно подключать к чему угодно — к файлам, программам и даже устройствам. В командном интерпретаторе bash такая операция называется перенаправлением.

< файл

Использовать файл как источник данных для стандартного потока ввода.

> файл

Направить стандартный поток вывода в файл. Если файл не существует, он будет создан; если существует — перезаписан сверху.

2> файл

Направить стандартный поток ошибок в файл. Если файл не существует, он будет создан; если существует — перезаписан сверху.

>>файл

Направить стандартный поток вывода в файл. Если файл не существует, он будет создан; если существует — данные будут дописаны к нему в конец.

2>>файл

Направить стандартный поток ошибок в файл. Если файл не существует, он будет создан; если существует — данные будут дописаны к нему в конец.

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