Студопедия  
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Ввод и вывод

Читайте также:
  1. Cat - слить и вывести файлы на стандартный вывод.
  2. V этап – Обоснование выводов
  3. Анализ внеклассовых теорий предоставляет возможность сделать вывод, что ни одна из них не дает полного, обоснованного объяснения происхождения и сути государства.
  4. Анализ теоретико-экспериментальных исследований и формулирование выводов
  5. Библиотека ввода/вывода
  6. В задачах № 1,3,4,5 выводы обязательны
  7. В заключении работы излагаются краткие выводы по теме, характеризуется степень ее раскрытия, определяется, достигнута ли цель и задачи работы.
  8. В каждой контрольной работе должен быть заметен личный вклад студента. Не забывайте делать выводы в конце ответа на каждый вопрос, указывайте свое личное отношение к проблеме.
  9. В конце каждой главы (раздела) подраздела следует обобщить материал в соответствии с целями и задачами, сформулировать выводы и достигнутые результаты.
  10. Введение в OC Linux. Перенаправление ввода-вывода. Программные каналы (конвейеры).

Любая программа - это приложение, предназначенное для обработки данных: получая на вход одну информацию, они в результате работы выдают некоторую другую. Хотя входящая и/или выходящая информация может быть и нулевой, т. е. попросту отсутствовать. Те данные, которые передаются программе для обработки - это её ввод, то, что она выдаёт в результате работы - вывод.

Организация ввода и вывода для каждой программы - это задача операционной системы.

Каждая программа работает с данными определённого типа: текстовыми, графическими, звуковыми и т. п. Как, наверное, уже стало понятно из предыдущих лекций, основной интерфейс управления системой в Linux — это терминал, который предназначен для передачи текстовой информации от пользователя системе и обратно (см. лекцию Терминал и командная строка). Поскольку ввести с терминала и вывести на терминал можно только текстовую информацию, то ввод и вывод программ, связанных с терминалом1, тоже должен быть текстовым. Однако необходимость оперировать с текстовыми данными не ограничивает возможности управления системой, а, наоборот, расширяет их. Человек может прочитать вывод любой программы и разобраться, что происходит в системе, а разные программы оказываются совместимыми между собой, поскольку использут один и тот же вид представления данных — текстовый.

«Текстовость» данных — всего лишь договорённость об их формате. Никто не мешает выводить на экран нетекстовый файл, однако пользы в том будет мало. Во-первых, раз уж файл содержит не текст, то не предполагается, что человек сможет что-либо понять из его содержимого. Во-вторых, если в нетекстовых данных, выводимых на терминал, случайно встретится управляющая последовательность, терминал её выполнит. Например, если в скомпилированной программе записано число 1528515121, оно представлено в виде четырёх байтов: 27, 91, 49 и 74. Соответвтующий им текст состоит из четырёх символов ASCII: «ESC», «[», «1» и «J», и при выводе файла на виртуальную консоль Linux в этом месте выполнится очистка экрана, так как «^[[1J» — именно такая управляющая последовательность для виртуальной консоли. Не все управляющие последовательности столь безобидны, поэтому использовать нетекстовые данные в качестве текстов не рекомендуется.

Для того, чтобы просмотреть содержимое нетекстового файла, можно воспользоваться программой hexdump, которая выдаёт содержимое файла в виде шестнадцатеричных ASCII-кодов, или strings, которая показывает только те части файла, что могут быть представлены в виде текста.

Для того, чтобы записать данные в файл или прочитать их оттуда, процессу необходимо сначала открыть этот файл (при открытии на запись, возможно, придётся предварительно создать его). При этом процесс получает дескриптор (описатель) открытого файла — уникальное для этого процесса число, которое он и будет использовать во всех операциях записи. Первый открытый файл получит дескриптор 0, второй — 1 и так далее. Закончив работу с файлом, процесс закрывает его, при этом дескриптор освобождается и может быть использован повторно. Если процесс завершается, не закрыв файлы, за него это делает система. Строго говоря, только в операции открытия дескриптора указывается, какой именно файл будет использоваться. В качестве «файла» используются и обычные файлы, и файлы-дырки (чаще всего — терминалы), и каналы. Дальнейшие операции — чтение, запись и закрытие, работают с дескриптором, как с потоком данных, а куда именно ведёт этот поток, неважно.

Каждый процесс Linux получает при старте три «файла», открытых для него системой. Первый из них (дескриптор 0) открыт на чтение, это стандартный ввод процесса. Именно со стандартным вводом работают все операции чтения, если в них не указан дескриптор файла. Второй (дескриптор 1) — открыт на запись, это стандартный вывод процесса. С ним работают все операции записи, если дескриптор файла не указан в них явно. Наконец, третий поток данных (дескриптор 2) предназначается для вывода диагностических сообщений, он называется стандартный вывод ошибок. Поскольку эти три дескриптора уже открыты к моменту запуска процесса, первый файл, открытый самим процессом, будет, скорее всего, иметь дескриптор 3.

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

Механизм копирования окружения, описанный в лекции Доступ процессов к файлам и каталогам, подразумевает, в числе прочего, копирование всех открытых дескрипторов родительского процесса дочернему. В результате, и родительский, и дочерний процесс имеют под одинаковыми дескрипторами одни и те же потоки данных. Когда запускается стартовый командный интерпретатор, все три заранее открытых дескриптора связаны у него с терминалом (точнее, с соответствующим файлом-дыркой типа tty): пользователь вводит команды с клавиатуры и видит сообщения на экране. Следовательно, любая команда, запускаемая из командной оболочки, будет выводить на тот же терминал, а любая команда, запущенная интерактивно (не в фоне) — вводить оттуда.

Некоторые программы умеют выводить информацию не только на терминал, но и в файл, например, info при указании параметрического ключа «-o» с именем файла выведет текст руководства в файл, вместо того, чтобы отображать его на мониторе. Даже если разработчиками программы не предусмотрен такой ключ. Другой способ сохранить вывод программы в файле вместо того, чтобы выводить его на монитор: поставить знак «>» и указать после него имя файла. Таким образом можно создавать короткие текстовые файлы (сценарии) при помощи утилиты cat.

Пример Перенаправление стандартного вывода в файл

$ cat > textfile

Это файл для примеров.

^$ ls –l textfile

-rw-r—r—l user user 13 Окт 15 16:06 textfile

От использования символа «>» возможности самой утилиты cat, конечно, не расширились. Более того, cat в этом примере не получила от командной оболочки никаких параметров: ни знака «>», ни последующего имени файла.

Вместо того, чтобы самой обеспечивать доставку вывода до конечного адресата (будь то человек или файл), cat отправляет все данные на стандартный вывод (сокращённо — stdout).

Подмена стандартного вывода — задача командной оболочки (shell). В данном примере shell создаёт пустой файл, имя которого указано после знака «>», и дескриптор этого файла передаётся программе cat под номером 1 (стандартный вывод). Делается это очень просто. В частности, после выполнения fork() появляется два одинаковых процесса, один из которых — дочерний — должен запустить вместо себя команду (выполнить exec()). А перед этим он закрывает стандартный вывод (дескриптор 1 освобождается) и открывает файл (с ним связывается первый свободный дескриптор, т. е. 1), а запускаемой команде ничего знать и не надо: её стандартный вывод уже подменён. Эта операция называется перенаправлением стандартного вывода. В том случае, если файл уже существует, shell запишет его заново, полностью уничтожив всё, что в нём содержалось до этого. Поэтому, чтобы продолжить записывать данные в textfile, потребуется другая операция — «>>».

$ cat >> textfile

Пример1.

^D

$ cat textfile

Это файл для примеров.

Пример1.

$

Стандартный вывод - поток данных, открываемый системой для каждого процесса в момент его запуска, и предназначенный для данных, выводимых процессом.

 


Дата добавления: 2014-12-19; просмотров: 14 | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2020 год. (0.011 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав