Файл: Учебнометодическое пособие Томск 2016 2 удк 004. 451(075. 8) Ббк 32. 973. 2018. 2я73 к 754 Рецензенты.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 07.11.2023
Просмотров: 351
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
209 ден конкурировать за время ЦП с обычными прикладными процессами. Суще- ственным отличием nfs-сервера от nfs-клиента и от программных частей дру- гих реальных ФС является то, что не виртуальная ФС инициирует этот модуль, а наоборот. При этом nfs-сервер играет роль своеобразного имитатора интер- фейса системных вызовов.
Рис. 7.5 Распределенная реальная файловая система nfs
При получении сообщения, содержащего просьбу о монтировании, nfs- сервер передает в свою виртуальную ФС команду проверить правомочность за- прашиваемой операции. Если проверка оказалась успешной, виртуальная ФС возвращает в nfs-сервер содержимое того vnode, который соответствует кор- ню монтируемого поддерева. Далее это содержимое посылается nfs-клиенту в виде сообщения по сети. Получив это сообщение, nfs-клиент завершает мон- тирование, создав свой inode для корня монтируемого поддерева файловой структуры, расположенного в другом узле сети. Данный inode включает среди прочей информации содержимое удаленного vnode.
Напомним, что среди прочей информации vnode имеет два поля, содер- жимое которых выполняет роль уникального имени файла в пределах данного
210 узла-сервера: 1) указатель на элемент в списке монтирования; 2) номер inode.
Пара этих чисел используется для указания требуемого файла в любом обраще- нии nfs-клиента к nfs-серверу. Например, если прикладной процесс в узле- клиенте выдал запрос на открытие файла, расположенного в узле-сервере, то, как и при открытии локального файла, в узле-клиенте создается vnode файла и делаются записи в системную файловую таблицу и в таблицу открытых фай- лов процесса. Что касается inode файла, то для его создания nfs-клиент по- сылает nfs-серверу сообщение с просьбой выполнить трансляцию имени тре- буемого файла. При этом в качестве имени файла nfs-клиент передает смещение относительно корня смонтированного поддерева, а в качестве имени корня поддерева передается указанная выше пара чисел.
Заметим, что при открытии файла по запросу удаленного клиента, nfs-сервер не делает никакие записи в системные таблицы, а ограничивается лишь выдачей vnode того файла, трансляцию имени которого запросил nfs-клиент. Содержимое двух полей этого vnodeиспользуется далее nfs-клиентом при выполнении всех системных вызовов, требующих выполне- ния информационного обмена с данным файлом (например, чтение файла). Не- смотря на то что программа прикладного процесса использует обычное логиче- ское имя (номер) файла, в протоколе общения между nfs-клиентом и nfs-сервером используется только указанное выше системное имя файла.
Этот же протокол регламентирует передачу в виде сообщений содержимого са- мого файла. При записи это содержимое передается от nfs-клиента к nfs- серверу. При чтении файла направление передачи будет, наоборот, от nfs- сервера к nfs-клиенту.
В заключение рассмотрим назначение дискового кэша (см. рис. 7.4). Как видно из этого рисунка, реальная ФС может взаимодействовать с управлением вводом-выводом не непосредственно, а через дисковый кэш – программный мо- дуль, включающий буфер для информационного обмена между устройствами
ВП (дисками) и областями оперативной памяти процессов, а также подпро- граммы для работы с этим буфером. Основная идея применения кэша заключа- ется в том, что его буфер содержит копии наиболее используемых секторов дисков. Поэтому вместо того чтобы с помощью подсистемы управления вво- дом-выводом выполнять чтение (запись) реальных секторов диска, реальная ФС выполняет с помощью подпрограмм кэша чтение (запись) тех элементов его буфера, которые соответствуют требуемым секторам диска.
211
Так как скорость переноса информации между ячейками ОП в тысячи раз превосходит скорость информационного обмена между диском и ОП, то при- менение кэша позволяет существенно повысить производительность любой ре- альной ФС (в том числе сетевой). Так как в среднем на 90% реальная ФС вы- полняет информационный обмен не с устройством ВП, а с кэшем, то увеличение производительности происходит примерно на порядок.
Существенным недостатком применения кэша является уменьшение надежности ФС из-за того, что текущее содержимое некоторых элементов кэша отличается от содержимого соответствующих секторов диска. Поэтому если в данный момент времени в ВС произойдет сбой, то фактическое содержимое информационных частей реальных ФС будет отличаться от их требуемого со- держимого.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Контрольные вопросы по главе 7
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
1. В чем отличия fat16 от fat32?
2. Какими основными особенностями обладает файловая система s5fs?
3. Опишите типовую логическую структуру жесткого диска.
4. Для чего служит дисковый кэш?
5. В чем отличие высокоуровневого и низкоуровневого форматирова- ния?
212
8 Лабораторный курс
Целью выполнения данного лабораторного курса является обучение сту- дентов использованию командного языка UNIX, то есть языка shell.
Лабораторный курс предназначен для выполнения в среде реальной
UNIX, установленной в учебном классе. При этом локальная сеть, объединяю- щая компьютеры класса, может находиться под управлением любой сетевой
ОС, поддерживающей протоколы связи с UNIX-системой, выполняемой на од- ном из компьютеров класса или вне его. При отсутствии такого класса допуска- ется выполнение лабораторных работ в среде локальных UNIX-систем.
Перед выполнением лабораторных работ в среде UNIX для получения до- ступа (пароля) к учебному серверу ТУСУР в электронном курсе по дисциплине необходимо отправить запрос о предоставлении учетных данных пользователя.
Для этого подготовьте документ со следующим содержанием: «Предоставьте
Логическое имя и Пароль», затем в формате *.pdf загрузите его в модуль «Кон- трольные и лабораторные работы», в элемент «Лабораторная работа № 1» (см. инструкцию по загрузке отчетов, которая размещена в материалах курса). Ло- гическое имя и пароль от преподавателя вы получите в виде рецензии или ком- ментария.
Оформление отчета
При оформлении отчетов по текстовым работам (контрольным и лабора- торным) следует руководствоваться требованиями Образовательного стандарта
ТУСУР 01-2021 «Работы студенческие по направлениям подготовки и специ- альностям технического профиля. Общие требования и правила оформления»
(https://regulations.tusur.ru/documents/70).
Отчет выполняется в текстовом редакторе в формате *.doc, *.docx или
*.odt. Отчет должен включать титульный лист (см. прил. А) и основную часть.
В основной части должны быть указаны цели работы, задание и его пункты, описание выполненной работы (скриншоты, текст) по каждому пункту, итого- вые выводы.
Отчет необходимо разместить в электронном курсе в формате *.pdf раз- мером не более 2 Мб. Перед загрузкой отчетов по лабораторным работам в электронный курс и отправкой их на проверку преподавателю ознакомьтесь с инструкцией по загрузке отчетов, которая размещена в курсе.
213
Выбор варианта
Для лабораторных работ № 1 и 2 разбиения по вариантам нет, в лабора- торных работах № 3 и 4 выбор осуществляется по общим правилам с использо- ванием следующей формулы:
V = (N × K) div 100, где V – искомый номер варианта,
N – общее количество вариантов, div – целочисленное деление, при V = 0 выбирается максимальный вариант,
K – код варианта.
8.1 Лабораторная работа № 1. Первоначальное знакомство
с UNIX
8.1.1 Цель работы
Целью выполнения настоящей лабораторной работы является получение начальных навыков работы в среде UNIX: 1) знакомство с текстовым редакто- ром ed; 2) применение команд shell для работы с файлами; 3) использование в командах shell метасимволов и перенаправление ввода-вывода; 4) запуск конвейеров программ; 5) применение в командах shellпеременных; 6) по- строение командных файлов; 7) изменение прав доступа к файлам.
8.1.2 Подготовка к выполнению работы
Перед началом выполнения данной работы обязательно следует изучить следующие вопросы из теоретической части пособия:
1) файлы с точки зрения пользователя (п. 2.2) – понятие файла; простое имя файла; каталоги; файловая структура системы; текущий каталог; относительное и абсолютное имена файла;
2) простые команды shell(утилиты) для работы с файловой структу- рой (пп. 2.3.2) – pwd; ls; cd; mkdir; rmdir; rm с флагом -r; cp с флагом -r;
3) простые команды shell (утилиты) для работы с файлами (пп. 2.3.3, пп. 2.3.4) – cat; cp; mv; rm;
4) команда вывода строки символов на экран echo (пп. 2.3.3);
214 5) использование метасимволов и перенаправление ввода-вывода
(пп. 2.5.2);
6) конвейеры программ (пп. 2.5.3);
7) переменные(пп. 2.5.4) – понятие переменной; способы задания значе- ний переменных (непосредственное задание строки символов; исполь- зование значения другой переменной; использование выходных дан- ных команды shell; применение команды ввода read); вывод переменных с помощью команды set; переменные окружения;
8) командные файлы (пп. 2.5.6) – понятие скрипта; способы запуска скрипта; вложенные скрипты; комментарии; позиционные параметры; инициализационный скрипт.profile;
9) защита файлов (п. 4.2) – типы пользователей; основные формы досту- па к файлу; права доступа; команда ls с флагом -l; команда chmod.
В процессе изучения перечисленных вопросов обязательно следует вы- полнить примеры, приведенные в пособии. Некоторые из этих примеров тре- буют предварительного создания вспомогательных текстовых файлов и (или) каталогов. Для этого можно использовать команды cat и mkdir.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Примечание. Допустим, что после включения терминала вы оказываетесь не в среде UNIX, а в среде другой операционной си- стемы, позволяющей связываться с UNIX. Тогда прежде чем ввести команды по входу в UNIX, необходимо войти в исходную операци- онную систему, а затем ввести ее команду по запуску «терминала» в среде UNIX. При этом под «терминалом» понимается не аппарат- ное устройство, а псевдотерминал – программный процесс, связан- ный с UNIX.
Например, если ваш терминал находится в локальной сети, управляемой операционной системой семейства Windows, то вы сначала входите в эту систему под своим логическим именем, кото- рое зарегистрировано в этой локальной сети. Студентам ФДО имя пользователя и пароль выдаются по запросу, отправленному в элек- тронном курсе (подробнее в соответствующем элементе электрон- ного курса). После этого следует запустить программу putty(ее можно найти в свободном доступе в сети Интернет [10]), которая осуществляет запуск программного процесса, имитирующего тер- минал UNIX. Необходимо заполнить следующие поля: Host name
215
(or IP address): kcup.tusur.ru, Port: 22, Connection type: SSH, в настройках putty указать кодировку UTF-8 и нажать кнопку
Open. В дальнейшем действовать в терминале, как изложено выше, и помнить о том, что при вводе пароля введенные символы не отоб- ражаются на экране.
Возможно также выполнение лабораторных работ на локальной системе – для этого достаточно записать образ любого популярного дистрибутива Linux, например Ubuntu, на флеш-диск или CD и либо загрузиться в режиме LiveCD, либо установить дополнительную ОС на свой жесткий диск [11], либо установить выбранный дистрибутив Linux на виртуальную машину (например,
VirtualBox) локально.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
8.1.3 Текстовый редактор ed
Редактор ed ориентирован на построчное редактирование текстовой ин- формации. При этом под строкой понимается текст, введенный до нажатия кла- виши
14 символов. При этом, как и в любой команде UNIX, команда ed отделяется от параметра одним или несколькими пробелами. Пример:
· · · · · · · · · · · · · · · · · · · · · · · · ·
Пример
· · · · · · · · · · · · · · · · · · · · · · · · ·
UNIX
$ польз.
ed letter
?letter
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
В данном примере файл letter новый и в нем еще ничего нет. Поэтому в ответном сообщении редактора присутствует символ «?». Если бы мы задали имя уже существующего файла, то edсообщил бы длину редактируемого фай- ла в байтах. При этом последняя строка могла бы выглядеть, например, так: ed 1234
216
Допустим пока, что мы создали новый (пустой) файл. Для того чтобы по- местить в него текст, необходимо перейти в режим добавления. Это делается командой
1 ... 15 16 17 18 19 20 21 22 23
a редактора. Пример:
· · · · · · · · · · · · · · · · · · · · · · · · ·
Пример
· · · · · · · · · · · · · · · · · · · · · · · · · польз.
a
ответа нет; переход на новую строку польз.
This is a test to see if I am
Once I have completed it I shall find
.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Обратите внимание на точку в последней строке. Она представляет собой команду выхода из режима добавления. Другого способа выхода из этого ре- жима нет. Так как только одиночная точка в строке будет воспринята редакто- ром как команда, а не как часть вводимого текста.
После того как текст файла набран, его можно выводить на экран и редак- тировать. Для вывода файла используется команда p редактора. Вывод файла можно выполнять построчно или в виде группы строк. Для построчного вывода редактору передается номер первой требуемой строки, в ответ на что edвыво- дит текст этой строки на экран. Далее вывод каждой следующей строки файла предваряется нажатием клавиши
· · · · · · · · · · · · · · · · · · · · · · · · ·
Пример
· · · · · · · · · · · · · · · · · · · · · · · · · польз.
1p
This is a test to see if I am польз.
entering text in the file “letter”. польз.
Once I have completed it I shall find польз.
that I have created 4 new lines
217 польз.
?
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Символ «?» означает, что текст файла закончился.
Для вывода на экран группы строк в редактор передаются одновременно номер первой и номер последней выводимой строки файла, разделенные запя- той. При этом для обозначения последней строки файла можно использовать символ $. Пример:
· · · · · · · · · · · · · · · · · · · · · · · · ·
Пример
· · · · · · · · · · · · · · · · · · · · · · · · · польз.
1,$p
This is a test to see if I am entering text in the file “letter”.
Once I have completed it I shall find that I have created 4 new lines of data
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Для выполнения редактирования файла, во-первых, устанавливается тре- буемая текущая строка, а во-вторых, выполняется требуемая операция редак- тирования. Для установки требуемой текущей строки можно использовать по- строчный вывод текста. Получив на экране требуемую строку, следует ввести одну из команд редактирования: a – добавление текста после текущей строки;
i– добавление текста перед текущей строкой; c – замена текущей строки тек- стом новой строки (строк); d– удаление текущей строки. Пример:
· · · · · · · · · · · · · · · · · · · · · · · · ·
Пример
· · · · · · · · · · · · · · · · · · · · · · · · · польз.
$p
that I have created 4 new lines польз.
a
I will now enter two new lines of
.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Команда редактора $pтребует от него вывода на экран последней строки файла. Поэтому две строки, набранные в примере пользователем, добавляются в конец файла. Пример добавления текста перед текущей строкой:
218
· · · · · · · · · · · · · · · · · · · · · · · · ·
Пример
· · · · · · · · · · · · · · · · · · · · · · · · · польз.
3p
Once I have completed it I shall find польз.
i
I am now inserting two lines of
.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Пример замещения текста текущей строки текстом другой строки:
· · · · · · · · · · · · · · · · · · · · · · · · ·
Пример
· · · · · · · · · · · · · · · · · · · · · · · · · польз.
3p
Once I have completed it I shall find польз.
c
After completion, I shall find.
.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
В данном примере текущая строка заменена текстом одной строки. На самом деле число новых строк может быть любым. В следующем примере про- изводится удаление двух строк:
· · · · · · · · · · · · · · · · · · · · · · · · ·
Пример
· · · · · · · · · · · · · · · · · · · · · · · · · польз.
3p
I am now inserting two lines of польз.
d
d
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Одной командой можно удалить целую группу строк. В следующем при- мере производится удаление всего содержимого файла:
219
· · · · · · · · · · · · · · · · · · · · · · · · ·
Пример
· · · · · · · · · · · · · · · · · · · · · · · · · польз.
1,$d
1,$p
?
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Если текст файла достаточно большой, рекомендуется выполнять проме- жуточное запоминание файла на диске, используя команду w. Выполнив ее, ре- дактор выведет на экран новую длину файла.
Выход из редактора edв UNIX выполняет команда редактора – q. Пример:
· · · · · · · · · · · · · · · · · · · · · · · · ·
Пример
· · · · · · · · · · · · · · · · · · · · · · · · · польз.
q
UNIX
$
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Выполните создание нового текстового файла, а затем вый- дите из редактора в UNIX. Далее скорректируйте этот файл, доба- вив новые строки в конец, в начало и в середину файла. Затем уда- лите некоторые строки и проверьте результаты редактирования с помощью вывода файла на экран.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
8.1.4 Задание
Для успешной сдачи работы требуется выполнить наизусть следующие операции:
1) создать два трехуровневых поддерева каталогов и поместить в один из каталогов четыре текстовых файла, два из которых имеют в своем имени одинаковую символьную последовательность, называемую да- лее «словом»;
2) с помощью ed отредактировать текстовый файл;
3) вывести файл на экран;
4) выполнить добавление текста в начало, в середину и в конец файла;
5) вывести файл на экран;
6) произвести переименование файла;
220 7) выполнить копирование файла (исходный файл и файл-копия должны располагаться в разных каталогах);
8) поместить в любой другой каталог скрипт, имеющий два входных па- раметра: имя каталога и набор символов. Скрипт выполняет действия:
вывод на экран перечня файлов, «дочерних» к заданному каталогу, которые имеют в своем имени заданный набор символов;
уничтожение всех остальных файлов заданного каталога;
любые другие действия (по вашему желанию);
9) создать свой инициализационный скрипт, выполняющий действия:
здоровается;
«переделывает» приглашения shell;
запускает вложенный скрипт, созданный в (8), задав ему в каче- стве параметров каталог и «слово» из (1);
любые другие действия (по вашему желанию);
10) выйти из UNIX, а затем войти вновь с целью демонстрации результа- тов выполнения инициализационного скрипта.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Примечание 1. При выполнении задания разрешается ис- пользовать те средства shell, которые рассмотрены в данной ра- боте. В частности нельзя применять управляющие операторы (рас- сматриваются в следующей работе).
Примечание 2. Для избирательного удаления файлов в (8) рекомендуется использовать команду rm с флагом -i, предвари- тельно установив права доступа к файлам. При этом для обеспече- ния автоматического выполнения rm ее стандартный ввод должен быть переключен на вспомогательный файл, содержащий любой символ кроме «y».
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
8.2 Лабораторная работа № 2.
Управляющие операторы командного языка
8.2.1 Цель работы
Целью выполнения настоящей лабораторной работы является развитие навыков программирования на языке shell путем использования в скриптах управляющих операторов if, case, for, while, until.
221
8.2.2 Подготовка к выполнению работы
В начале выполнения данной работы обязательно следует изучить следу- ющие вопросы из теоретической части пособия (пп. 2.5.5):
1) оператор двухальтернативного выбора if;
2) оператор многоальтернативного выбора case;
3) оператор цикла с перечислением for;
4) оператор цикла с условием while;
5) оператор цикла с инверсным условием until.
В процессе изучения перечисленных вопросов обязательно следует вы- полнить примеры, приведенные в пособии.
8.2.3 Задание
Требуется разработать программу на языке shell (без использования команды find), выполняющую поиск в заданном поддереве файловой струк- туры всех файлов, имена которых отвечают заданному шаблону. Результатом работы программы является перечень имен искомых файлов на экране.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Примечание. Программа состоит из двух скриптов. Главный скрипт выполняет вывод на экран приглашения ввести с клавиату- ры имя-путь начального каталога и шаблон поиска. Далее он вы- полняет ввод этих данных с клавиатуры и выводит на экран пере- чень искомых файлов в начальном каталоге поиска (если они там есть). Затем он вызывает для каждого подкаталога вложенный скрипт, передав ему два входных параметра: 1) относительное имя подкаталога; 2) шаблон поиска.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
Вложенный скрипт выполняет поиск в заданном каталоге искомых фай- лов, а для каждого подкаталога вызывает точно такой же скрипт. (При выпол- нении любого скрипта запускается новый экземпляр shell, поэтому рекур- сивное выполнение скриптов не приводит к каким-либо трудностям.)
222
8.3 Лабораторная работа № 3.
Операции с файлами в программе на языке Си
8.3.1 Цель работы
Целью выполнения настоящей лабораторной работы является получение начальных навыков использования системных вызовов UNIX в программах на языке Си. Данные вызовы выполняют основные операции с файлами: откры- тие и создание, чтение и запись, закрытие и уничтожение.
8.3.2 Подготовка к выполнению работы
В начале выполнения данной работы рекомендуется изучить следующие вопросы из теоретической части пособия:
1) логические файлы (пп. 7.1.1) [1, 2];
2) открытие файла (пп. 7.1.2) [1, 2];
3) создание файла (пп. 7.1.3) [1, 2];
4) понятие файлового указателя (пп. 7.1.2) [1, 2] и его перемещение
(пп. 7.1.3) [1, 2];
5) чтение из файла и запись в него (пп. 7.1.3) [1, 2];
6) закрытие и уничтожение файла (пп. 7.1.3) [1, 2].
8.3.3 Введение
Разработку программ начнем с программирования операций с файлами.
Для этого программа на Си имеет две основные возможности. Первая из них предполагает непосредственное обращение из программы к ядру ОС с помо- щью системных вызовов. Вторая возможность реализуется путем вызова функ- ций стандартной библиотеки ввода-вывода. Эти функции предоставляют при- кладной программе более удобный интерфейс, освобождая ее, в частности, от собственной буферизации файловых операций. Но основную работу с файлами по-прежнему выполняют системные вызовы, которые теперь делаются не из прикладной программы, а из функций стандартной библиотеки. Не допускается использовать оба перечисленных способа для работы с одним и тем же файлом в одной и той же программе.
Одним из различий двух названных подходов, учитываемых при про- граммировании, является способ задания логического имени файла в програм- ме. В отличие от имени физического файла, которое уникально для всей систе-
223 мы (это или имя-путь или относительное имя – смещение относительно теку- щего каталога) логическое имя файла обладает уникальностью только в пределах данного процесса. Если для работы с данным файлом в программе применяются системные вызовы, то в качестве логического имени файла ис- пользуется его номер, уникальный для данного процесса.
Если для работы с файлом в программе применяются функции стандарт- ной библиотеки, то в качестве логического имени файла используется указатель на таблицу (структуру), используемую этими функциями для работы с файлом.
Данная структура имеет тип FILE. Одно из ее полей содержит номер файла, позволяя тем самым стандартным функциям осуществлять системные вызовы.
(Полезно заметить, что аналогичные структуры применяются для работы с файлами и в языке Паскаль.)
8.3.4 Открытие существующего файла
Результатом выполнения операции открытия файла является или логиче- ское имя файла, или признак ошибки.
Системные вызовы. Открытие файла выполняет системный вызов open
. Его описание: int open(const char *pathname, int flags, [mode_t mode]);
Данный вызов возвращает в программу или номер открытого файла (не- отрицательное целое число) или –1 (признак ошибки). Ошибка может произой- ти, например, если файл не существует.
Первый параметр (pathname) является указателем на символьную стро- ку, содержащую имя физического файла. В качестве этого имени здесь, а также во всех приводимых ниже системных вызовах и в стандартных функциях, мож- но использовать или имя-путь файла, или его относительное имя.
Второй параметр (flags) вызова open определяет запрашиваемый ме- тод доступа к файлу. Этот параметр принимает одно из значений, заданных константами в заголовочном файле <fcntl.h>. (Как и большинство заголо- вочных файлов, <fcntl.h> находится в каталоге /usr/include и может быть включен в программу с помощью директивы #include
Три особо интересных константы:
1) O_RDONLY – открыть файл только для чтения;
2) O_WRONLY– открыть файл только для записи;
3) O_RDWR – открыть файл для чтения и для записи.
224
Третий параметр (mode) необязательный (об этом свидетельствуют квад- ратные скобки). При открытии существующего файла он не используется.
Пример программы:
#include
#include
{ int fil;
/* Открыть файл для чтения-записи */ if ((fil = open(namefile, O_RDWR)) = = -1)
{ printf(“Невозможно открыть %s\n”, namefile); exit(1); /* Выход по ошибке */
} exit(0); /* Нормальный выход */
}
Данная программа не выполняет никакой полезной работы, а просто де- монстрирует некоторые важные моменты. Во-первых, всякая файловая опера- ция может завершиться с ошибкой. Поэтому такая возможность должна быть обязательно предусмотрена в программе. Во-вторых, выход из программы
(а точнее – завершение соответствующего программного процесса) выполняет системный вызов exit, единственный параметр которого содержит код завер- шения процесса (0 – успешно; –1 – с ошибкой). Прототип этого системного вызова содержится в заголовочном файле <stdlib.h>.
Следующая программа отличается от предыдущей только тем, что имя открываемого файла задается не в тексте программы, а из командной строки shell в качестве параметра запускаемого файла. Допустим, что готовая про- грамма помещена в файл open_file. Тогда для ее запуска можно использо- вать командную строку:
$ open_file abc
Текст программы:
#include
#include
{
225 int fil; if (argc !=2)
{ printf(“Need 1 argument for open\n”); exit(1); /* Выход по ошибке */
}
/* Открыть файл для чтения-записи */ if ((fil = open(argv[1], O_RDWR)) = = -1)
{ printf(“Cannot open file %s\n”, argv[1]); exit(1); /* Выход по ошибке */
} exit(0); /* Нормальный выход */
} shell запускает главную подпрограмму main, присвоив ее аргументу argc значение количества параметров в списке argv, а каждому элементу массива argv значение соответствующего параметра из командной строки. В примере argc равно 2, элемент argv[0] содержит строку символов
«open_file» (имя программы условно является нулевым параметром), argv[1] – строку символов «abc». В начале своего выполнения программа проверяет, правильное ли число параметров ей было передано при запуске.
Функции стандартной библиотеки. Открытие файла выполняет стан- дартная функция fopen. Следующая программа выполняет то же самое, что и программа в предыдущем примере – открывает файл, имя которого пользова- тель набирает в командной строке в качестве параметра запускаемого файла:
#include
#include
fopen и т. д.*/ main(int argc, char *argv[])
{
FILE *stream; if (argc !=2)
{ printf(“Need 1 argument for open\n”); exit(1); /* Выход по ошибке */
/* Открыть файл для чтения-записи */
226
} if ((stream = fopen(argv[1], “r+”)) = = NULL)
{ printf(“Cannot open file %s\n”, argv[1]); exit(1); /* Выход по ошибке */
} exit(0); /* Нормальный выход */
}
Первый параметр функции fopen – указатель на имя открываемого фи- зического файла. Второй параметр – символьная строка, которая определяет за- прашиваемый метод доступа к файлу: «r» – файл открывается только для чте- ния; «a» – файл открывается только для записи; «r+» – для чтения и записи.
В случае успеха функция fopen заполняет для файла структуру FILE и воз- вращает в переменной stream ее адрес. В случае ошибки возвращается указа- тель NULL.
· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
1 ... 15 16 17 18 19 20 21 22 23