А. Робачевский - Операционная система UNIX (1114671), страница 27
Текст из файла (страница 27)
При создании буфера библиотека выбирает оптимальныйразмер для данного потока. Обычно этот размер равен значению поляs t _ b l k s i z e структуры stat, возвращаемой системным вызовомрассмотренный в разделе "Метаданные файла" этой главы. Если опреде!лить оптимальный размер невозможно, например для каналов или специ!альных файлов устройств, выбирается стандартное значениеопре!деленное в файле <stdio.h>.Рис. 2.9. Структурыданных потокаСвязиВ метаданных каждого файла файловой системы UNIX хранится числосвязей, определяющее количество имен, которое имеет данный файл. На!www.books-shop.com134Глава 2.программирования UNIXпример, файлы(илиetc/rc0.d/K201p, /etc/rc2.d/K20Ipиимеют различные имена, но ссылаются на один и тот жефизический файл (точнее, метаданные файла) и тем самым обеспечиваютдоступ к одним и тем же данным. В данном случае число связей файларавно 4.
Каждый раз, когда одно из имен файла удаляется, число связейсоответственно уменьшается. Когда оно достигнет нуля — данные файлабудут удалены. Такой тип связи называется жесткой.Жесткая связь создается с помощью системного вызоваintcharconst charПри этом будет образована новая запись каталога с именем new и номеромinode указывающим на метаданные файла existing. Также будет увеличе!но число связей. Этим системным вызовом, в частности, пользуется ко!мандарассмотренная в главе 1.Для удаления жесткой связи используется системный вызовttinclude <unistd.h>intcharЭту функцию вызывает командапри удалении файла.
При этом необязательно будут удалены данные файла. Заметим, что системный вызов,явно удаляющий данные файла, отсутствует, поскольку у файла может су!ществовать несколько жестких связей, часть из которых может быть недос!тупна процессу, вызывающему такую функцию (например, одно из именфайла может быть расположено в недоступном каталоге).В противоположность жестким связям, которые, как отмечалось в главеявляются естественным способом адресации данных файла, в UNIX при!меняются символические связи, адресующие не данные файла, а его имя.Например, если файл является символической связью, то в его данныххранится имя файла, данные которого косвенно адресуются.Символическая связь позволяет косвенно адресовать другой файл файло!вой системы. Системный вызовслужит для создания символиче!ской связи.
Этим вызовом, кстати, пользуется команда!s.ttinclude <unistd.h>intchar *name,const charПосле создания символической связи, доступ к целевому файлу name мо!жет осуществляться с помощью symname. При этом, функцияпринимая в качестве аргумента имя символической связи, на самом делеоткрывает целевой файл. Такая особенность называется следованием симво!лической связи. Не все системные вызовы обладают этим свойством. На!пример, системный вызовудаляющий запись в каталоге, дейст!вует только на саму символическую связь. В противном случае, мы неимели бы возможности удалить ее.
В табл.показано, как работают ссимволическими связями различные системные вызовы.www.books-shop.comРабота с файламиТаблицаСистемныйвызов/35Интерпретация символической связи различными системными вызовамисвязиaccess (2)chdir(2)chmod(2)chown(2)++++creat(2)exec(2)link(2)++++Не следует символическойсвязи+mknod(2)open(2)readlink(2)lstat(2)unlink(2)++++++Для чтения содержимого файла — символической связи используется сис!темный вызовttincludeintchar *path, void *buf, size_tАргумент path содержит имя символической связи. В буфереразме!ромвозвращается содержимое файла — символической связи.Для иллюстрации к вышеприведенным рассуждениям приведем примерпрограммы, которая сначала выводит содержимое символической связи, азатем — целевого файла, пользуясь в обоих случаях символическим име!нем:lincludettincludettinclude <fcntl.h><stdio.h>BUFSZ 256/*B качестве аргумента программа принимаетимя символическойargc, charwww.books-shop.com136Глава 2.charint n r e a d ,программирования UNIXfd;/*Прочитаем содержимое самой символическойсиволическуюnread =buf,if (nread < 0){}/*readlink не завершает строку=/*Теперъ прочитаем содержимое целевогоцелевойfd =if (fd < 0){}nread =if (nread < 0){buf,}=exit}Перед тем как запустить программу, создадим символическую связь с фай!лом unix0.txt:$$s111andyuseruser10498Jan 6 0 9 : 5 4Jan 6 0 9 : 5 3s y m l i n k .
t x t !>unix0.txt$Читаем сиволическую связьСимволическаяЧитаем целевой файлЦелевойНачиная с 1975 года фирма AT&T начала предоставлять лицензии наиспользование операционной системы как научнообразовательнымучреждениям, так и коммерческим организациям. Поскольку основнаячасть системы поставлялась в исходных текстах, написанных наязыке С, опытным программистам не требовалось детальнойдокументации, чтобы разобраться в архитектуре UNIX. С ростомпопулярности микропроцессоровwww.books-shop.comРабота с файламиФайлы, отображаемые в памятиСистемный вызовпредоставляет механизм доступа к файлам, аль!тернативный вызовамиС помощью этого вызова процессимеет возможность отобразить участки файла в собственное адресное про!странство.
После этого данные файла могут быть получены или записаныпутем чтения или записи в память. Функцияопределяется сле!дующим образом:#includecaddr_tintaddr, size_tint prot,f l a g s , int f i l d e s ,Этот вызов задает отображение len байтов файла с дескриптором fildes,начиная со смещения o f f , в область памяти со стартовым адресом addr.Разумеется, перед вызовомфайл должен быть открыт с помощьюфункцииАргумент prot определяет права доступа к области памя!ти, которые должны соответствовать правам доступа к файлу, указанным всистемном вызове ореп(2).
В табл. 2.12 приведены возможные значенияаргумента prot и соответствующие им права доступа к файлу. Возможнологическое объединение отдельных значений prot. Так значениеPROT_READ |соответствует доступук файлу.Таблица 2.12. Права доступа к области памятиЗначение аргу[мента protОписаниеПрава доступа к файлуPROT READОбласть доступна для чтенияPROT WRITEОбласть доступна для записиwPROT EXECОбласть доступна для испол%ненияXPROT NONEОбласть недоступна—Обычно значение addr задается равным 0, что позволяет операционнойсистеме самостоятельно выбрать виртуальный адрес начала области ото!бражения. В любом случае, при успешном завершении возвращаемое сис!темным вызовом значение определяет действительное расположение об!ласти памяти.Операционная система округляет значение len до следующей страницывиртуальнойНапример, если размер файла 96 байтов, а размерстраницы 4 Кбайт, то система все равно выделит область памяти размером4096 байтов.
При этом 96 байтов займут собственно данные файла, а ос!тальные 4000 байтов будут заполнены нулями. Процесс может модифици!Организация виртуальной памяти подробно рассматривается в главе 3.www.books-shop.com1382.программирования UNIXровать и оставшиеся 4000 байтов, но эти изменения не отразятся на со!держимом файла. При обращении к участку памяти, лежащему за преде!лами файла, ядро отправит процессу сигналНесмотря на то чтообласть памяти может превышать фактический размер файла, процесс неимеет возможности изменить его размер.Использование права на исполнение (prot = PROT_EXEC) позволяет про!цессу определить собственный механизм загрузки кода. В частности, такойподход используется редактором динамических связей при загрузке дина!мических библиотек, когда библиотека отображается в адресное простран!ство процесса.
Значениепозволяет приложению определитьсобственные механизмы контроля доступа к разделяемым объектам(например, к разделяемой памяти), разрешая или запрещая доступ к об!ласти памяти.Аргументопределяет дополнительные особенности управления об!ластью памяти. В табл. 2.13 приведены возможные типы отображения, оп!ределяемые аргументомТаблица 2.13. Типыаргумента flagsMAP_FIXEDMAP_NORESERVEОписаниеОбласть памяти может совместно использовать%ся несколькими процессамиОбласть памяти используется только вызываю%щим процессомТребует выделения памяти, начиная точно с ад%реса addrHe требует резервирования области свопингаВ случае указаниядля процесса, определившего этот типотображения, будет создана собственная копия страницы памяти, которуюон пытается модифицировать.