А. Робачевский - Операционная система UNIX (1114671), страница 28
Текст из файла (страница 28)
Заметим, что копия будет создана толькопри вызове операции записи, до этого остальные процессы, определившиетип отображения как MAP_SHARED могут совместно использовать одну и туже область памяти.Не рекомендуется использовать флагт. к. это не позволяетсистеме максимально эффективно распределить память. В случае отсутст!вия этого флага, ядро пытается выделить область памяти, начиная с адресанаиболее близкого к значению addr. Если же значение addr установленоравным 0, операционная система получает полную свободу в размещенииобласти отображения.Если быть более точным, сигнал посылается процессу, когда происходит обращение кстранице памяти, на которую не отображается ни один из участков файла. Таким образом,в приведенном примере сигнал процессу не будет отправлен.www.books-shop.comРабота с файлами139Отображение автоматически снимается при завершении процесса.
Процесстакже может явно снять отображение с помощью вызоваЗа!крытие файла не приводит к снятию отображения. Следует отметить, чтоснятие отображения непосредственно не влияет на отображаемый файл,т. е. содержимое страниц области отображения не будет немедленно запи!сано на диск. Обновление файла производится ядром согласно алгоритмамуправления виртуальной памятью. В то же время в ряде систем существуетфункциякоторая позволяет синхронизировать обновление па!мяти с обновлением файла наВ качестве примера приведем упрощенную версию утилитыкопирую!щую один файл в другой с использованием отображения файла в память.<sys/stat.h>#includeraain(int argc, char{intcaddr_t addr_src,struct stat filestat;аргумент — исходный файл, второй —|размер исходного/*Сделаем размер целевого файла равнымlseek(fd_dst, 1,/*3ададимfd_src,PROT_READ |fd_dst, 0);/*Копируем областиaddr_src,exit}Поскольку, как обсуждалось выше, с помощью вызованельзя из!менить размер файла, это было сделано с помощью вызова lseek(2) с по!На самом делесинхронизирует обновление страниц памяти с вторичной памятью.Для областей типавторичной памятью является сам файл на диске.
Для об!ластей типавторичной памятью является область свопинга. Функциятакже позволяет принудительно обновить страницы, так что при следующем об!ращении к какой!либо из них ее содержимое будет загружено из вторичной памяти.Ⱦɚɧɧɚɹɜɟɪɫɢɹɤɧɢɝɢɜɵɩɭɳɟɧɚɷɥɟɤɬɪɨɧɧɵɦɢɡɞɚɬɟɥɶɫɬɜɨɦ%RRNVVKRSɊɚɫɩɪɨɫɬɪɚɧɟɧɢɟɩɪɨɞɚɠɚɩɟɪɟɡɚɩɢɫɶɞɚɧɧɨɣɤɧɢɝɢɢɥɢɟɟɱɚɫɬɟɣɁȺɉɊȿɓȿɇɕɈɜɫɟɯɧɚɪɭɲɟɧɢɹɯɩɪɨɫɶɛɚɫɨɨɛɳɚɬɶɩɨɚɞɪɟɫɭpiracy@books-shop.comГлава 2.программирования UNIXследующей записью одного байта так, что размер целевого файла сталравным размеру исходного. При этом в целевом файле образуется "дыра",которая, к счастью, сразу же заполняется содержимым копируемого файла.Владение файламиВладелец!пользователь и владелец!группа файла могут быть изменены спомощью системных вызововиintintintcharfildes,charuid_t owner, gid_towner, gid_tuid_t owner, gid_tВсе три вызова работают одинаково за исключением ситуации, когда адре!суемый файл является символической связью.
В последнем случае вызовдействует на сам файл — символическую связь, а не на целевойфайл (т. е. не следует символической связи). В функцияхифайл адресуется по имени, а в— по файловому деск!риптору. Если значение owner или group установлено равнымсоответ!ствующий владелец файла не изменяется.В версиях BSD UNIX только суперпользователь может изменить владениефайлом. Это ограничение призвано, в первую очередь, не допустить"скрытие" файлов под именем другого пользователя, например, при уста!новке квотирования ресурсов файловой системы. Владельца!группу можноизменить только для файлов, которыми вы владеете, причем им можетстать одна из групп, членом которой вы являетесь.
Эти же ограниченияопределены и стандартомВ системах ветви System V эти ограничения являются конфигурируемыми,и в общем случае в UNIX System V пользователь может изменить владель!ца собственных файлов.В случае успешного изменения владельцев файла биты SUID и SGIDсбрасываются, если процесс, вызвавшийне обладает правами су!перпользователя.Права доступаКак уже обсуждалось в предыдущей главе, каждый процесс имеет четырепользовательских идентификатора —EUID и EGID.
В то вре!мя как UID и GID определяют реального владельца процесса, EUID иEGID определяют права доступа процесса к файлам в процессе выполне!ния. В общем случае реальные и эффективные идентификаторы эквива!лентны. Это значит, что процесс имеет те же привилегии, что и пользова!тель, запустивший его. Однако, как уже обсуждалосьвозникаютситуации, когда процесс должен получить дополнительные привилегии,www.books-shop.com141Работа с файламичаще всего — привилегии суперпользователя.
Это достигается установкойбитов SUID и SGID. Примером такого процесса может служить утилитаизменяющая пароль пользователя.Права доступа к файлу могут быть изменены с помощью системных вызо!вовиiinclude<sys/stat.h>int chmod(const char *path, mode_tfildes,Значение аргумента mode определяет устанавливаемые права доступа и допол!нительные атрибуты (такие как SUID, SGID и Sticky bit), и создается путемлогического объединения различных флагов, представленных в табл.
2.14.Вторая колонка таблицы содержит восьмеричные значения для девяти битовправ доступа (чтение, запись и выполнение для трех классов доступа) и трехбитов дополнительных атрибутов.Таблица 2.14. Флаги аргумента modeФлагS ISUIDБитыЗначение04000Установить бит SUIDSGID,7, 5, или 1Установить обязательное блокирование файла, если #равно 6, 4, 2 или ОУстановить Sticky bitУстановить право на чтение, запись и выполнение длявладельца%пользователяУстановить право на чтение для владельца%пользо%вателяУстановить право на запись для владельца%пользователяУстановить право на выполнение для владельца%поль%зователяУстановить право на чтение, запись и выполнение длявладельца%группыУстановить право на чтение для владельца%группыS_ISGIDS ISVTX0100000700S_IRUSR00400S002000010000070S0004000020S IXGRP00010S IRGRP00007S0000400002S_IXOTH00001S IROTHУстановить право на запись для владельца%группыУстановить право на выполнение для владельца%группыУстановить право на чтение, запись и выполнение дляостальных пользователейУстановить право на чтение для остальных пользователейУстановить право на запись для остальных пользователейУстановить право на выполнение для остальных пользо%вателейwww.books-shop.com142Глава 2.
Среда программирования UNIXНекоторые флаги, представленные в таблице, уже являются объединениемнескольких флагов. Так, например, флагэквивалентен|| S_IXUSR. Значение флага S_ISGID зависит от того, установле!но или нет право на выполнение для группыВ первом случае,он будет означать установку SGID, а во втором — обязательное блокиро!вание файла.Для иллюстрации приведем небольшую программу, создающую файл сполными правами доступа для владельца, а затем изменяющую их.
Послекаждой установки прав доступа в программе вызывается библиотечнаяфункцияпозволяющая запустить утилиту ls(l) и отобразить из!менение прав доступа и дополнительных атрибутов.ttinclude<sys/stat.h><stdlib.h>main{int fd;/*Создадим файл с правамиfd =1флаг*/1блокирование записей файла */|1установим флаг1}В результате запуска программы на выполнение, получим следующий вы!вод:$rwsrwsrwsandy11 andyuseruseruser000D.; оJan 6 19::28Jan 6 19::28Jan 6 19::28my filemy filemy fileПеремещение по файловой системеКаждый процесс имеет два атрибута, связанных с файловой системой —корневой каталог (root directory) и текущий рабочий каталог (currentworking directory).
Когда некоторый файл адресуется по имени (например,в системных вызовахилиядро системы произ!водит поиск файла, начиная с корневого каталога, если имя файла заданокак абсолютное, либо текущего каталога, если имя файла является относи!www.books-shop.comРабота с файламительным. Абсолютное имя файла начинается с символа '/', обозначающегокорневой каталог. Все остальные имена файлов являются относительными.Например, имяявляется абсолютным, в то время какили— относительным, при котором фак!тическое расположение файла в файловой системе зависит от текущегоПроцесс может изменить свой корневой каталог с помощью системноговызоваилиintintcharПосле этого поиск всех адресуемых файлов с абсолютными именами будетпроизводиться, начиная с нового каталога, указанного аргументом path.Например, после изменения корневого каталога на домашний каталогпользователя абсолютное имяскриптастанетИзменение корневого каталога может потребоваться, например, при рас!паковке архива, созданного с абсолютными именами файла, в другом мес!те файловой системы, либо при работе над большим программным проек!том, затрагивающим существенную часть корневой файловой системы.