А. Робачевский - Операционная система UNIX (1114671), страница 29
Текст из файла (страница 29)
Вэтом случае для отладочной версии удобно создать собственную корневуюиерархию.Процесс также может изменить и текущий каталог. Для этого используют!ся системные вызовыилиintint<unistd.h>charНапример, внутренняя команда командного интерпретаторареализована следующим кодом:может бытьcharчто имя нового каталога, введенного пользователем,уже находится в переменной== 1)Изменение корневого каталога разрешено только для администратора системы — супер!пользователя.
Эта операция таит в себе определенную опасность, т. к. часть утилит опера!ционной системы (если не все) могут оказаться недоступными, в том числе и командаТаким образом, последствия необдуманного изменения корневого каталогамогут стать необратимыми.www.books-shop.comГлава 2. Среда программирования UNIX144Метаданные файлаКак уже говорилось, каждый файл помимо собственно данных содержитметаданные, описывающие его характеристики, например, владельцев,права доступа, тип и размер файла, а также содержащие указатели на фак!тическое расположение данных файла.
Метаданные файла хранятся вструктуре inode. Часть полей этой структуры могут быть получены с по!мощью системных вызовов<sys/stat.h>charstruct stat(const charstruct statfildes, struct statintintВ качестве аргумента функции принимают имя файла или файловый деск!риптори возвращают заполненные поля структуры s t a t , которыеприведены в табл.Таблица 2.15. Поля структуры statПолеЗначениеmode t st modeТип файла и права доступаНомер inode. Поля st_ino и st_dev однозначно определя%ют обычные файлыino_tdev t st devdev_tНомер устройства, на котором расположен файл (номер уст%ройства файловой системы)Для специального файла устройства содержит номер устрой%ства, адресуемого этим файломt stЧисло жестких связейuid t st uidИдентификатор пользователя%владельца файлаgid_t st_gidИдентификатор группы%владельца файлаРазмер файла в байтах.
Для специальных файлов устройствэто поле не определеноoff t st sizest_atimetime t stВремя последнего доступа к файлуВремя последней модификации данных файлаtime t st ctimeВремя последней модификации метаданных файлаlong st b l k s i z eОптимальный размер блока для операцийДляспециальных файлов устройств и каналов это поле не опре%деленоlongЧисло размещенных 512%байтовых блоков хранения данных.Для специальных файлов устройств это поле не определеноst_blocksДля определения типа файла служат следующие макроопределения, опи!санные в файле <sys/stat.h>:www.books-shop.comРабота с файлами145Таблица 2.16.
Определение типа файлаМакроопределениеТип файлаSFIFOСпециальный файл символьного устройстваКаталогSСпециальный файл блочного устройстваSОбычный файлСимволическая связьSСокетВсе значения времени, связанные с файлом (время доступа, модифика!ции данных и метаданных) хранятся в секундах, прошедших с 0 часовянваря 1970 года. Заметим, что информация о времени создания файлаотсутствует.Приведенная ниже программа выводит информацию о файле, имя кото!рого передается ей в качестве аргумента:<sys/stat.h>#include <time.h>argc, char{struct statchar, &s)тип) ptype = "Обычный файл";elsest_mode) ) ptype = "Каталог";elseptype =связь";elseptype = "Симв.
устройство";elseptype =elseptype = "Сокет";elseptype = "FIFO";else ptype = "Неизвестныйинформацию о=/*Права=&/*Номер inode*/=/*Число=/*Устройство, на котором хранятся данные= (%d,www.books-shop.comГлава 2. Среда программирования UNIX==/*Для специальных файлов устройств — номера= (%d,=доступа, модификации и модификации===}Программа использует библиотечные функцииивоз!вращающие, соответственно, старший и младший номера устройства.Функцияпреобразует системное время в удобный формат.Запуск программы на выполнение приведет к следующим результатам:$type = Обычный файлperm =inode = 13= 1dev = (1,= 286= 100rdev = (0, 0)size = 1064atime = Wed Jan 8 17:25:34 1997mtime = Wed Jan 8 17:19:27 1997ctime = Wed Jan 8 17:19:27 1997$131 andyuser1064Jan 8fсПроцессыВ главе 1 уже упоминались процессы. Однако знакомство ограничивалосьпользовательским, или командным интерфейсом операционной системы.В этом разделе попробуем взглянуть на них с точки зрения программиста.Процессы являются основным двигателем операционной системы.
Боль!шинство функций выполняется ядром требованиюили иного процес!са. Выполнение этих функций контролируется привилегиями процесса,которые соответствуют привилегиям пользователя, запустившего его.В этом разделе рассматриваются:Идентификаторы процессаwww.books-shop.comПроцессы/47Программный интерфейс управления памятью: системные вызовынизкого уровня и библиотечные функции, позволяющие упроститьуправление динамической памятью процесса.Важнейшие системные вызовы, обеспечивающие создание новогопроцесса и запуск новой программы.
Именно с помощью этих вызо!вов создается существующая популяция процессов в операционнойсистеме и ее функциональность.Сигналы и способы управления ими. Сигналы можно рассматриватькак элементарную форму межпроцессного взаимодействия, позво!ляющую процессам сообщать друг другу о наступлении некоторыхсобытий.
Более мощные средства будут рассмотрены в разделе"Взаимодействие между процессами" главы 3.ППГруппы и сеансы; взаимодействие процесса с пользователем.Ограничения, накладываемые на процесс, и функции, которые по!зволяют управлять этими ограничениями.Идентификаторы процессаВы уже знаете, что каждый процесс характеризуется набором атрибутов иидентификаторов, позволяющих системе управлять его работой. Важней!шими из них являются идентификатор процесса PID и идентификатор ро!дительского процессаPID является именем процесса в операцион!ной системе, по которому мы можем адресовать его, например, при от!правлении сигнала.
PPID указывает на родственные отношения междупроцессами, которые (как и в жизни) в значительной степени определяютего свойства и возможности.Однако нельзя не отметить еще четыре идентификатора, играющие ре!шающую роль при доступе к системным ресурсам: идентификатор пользо!вателя UID, эффективный идентификатор пользователя EUID, идентифи!катор группыи эффективный идентификатор группы EGID. Этиидентификаторы определяют права процесса в файловой системе, и какследствие, в операционной системе в целом. Запуская различные командыи утилиты, можно заметить, что порожденные этими командами процессыполностью отражают права пользователя UNIX. Причина проста — всепроцессы, которые запускаются, имеют идентификатор пользователя иидентификатор группы.
Исключение составляют процессы с установлен!ными флагамии SGID.При регистрации пользователя в системе утилитазапускает ко!мандный интерпретатор, — login shell, имя которого является одним изатрибутов пользователя. При этом идентификаторам UID (EUID) и GID(EGID) процесса shell присваиваются значения, полученные из записипользователя в файле паролей /etc/passwd.
Таким образом, командный ин!терпретатор обладает правами, определенными для данного пользователя.www.books-shop.com148Глава 2.программирования UNIXПри запуске программы командный интерпретатор порождает процесс,который наследует все четыре идентификатора и, следовательно, имеет теже права, что и shell. Поскольку в конкретном сеансе работы пользователяв системе прародителем всех процессов является login shell, то и их поль!зовательские идентификаторы будут идентичны.Казалось бы, эту стройную систему могут "испортить" утилиты с установ!ленными флагами SUID и SGID.
Но не стоит волноваться — как правило,такие программы не позволяют порождать другие процессы, в противномслучае, эти утилиты необходимо немедленно уничтожить!На рис.показан процесс наследования пользовательских идентифика!торов в рамках одного сеанса работы.Рис. 2.10. Наследование пользовательских идентификаторовwww.books-shop.comПроцессы149Для получения значений идентификаторов процесса используются сле!дующие системные вызовы:uid tuid_tgid_tgid_tЭти функции возвращают для сделавшего вызов процесса соответственнореальный и эффективный идентификаторы пользователя и реальный иэффективный идентификаторы группы.Процесс также может изменить значения этих идентификаторов с помо!щью системных вызовов:ttinclude<unistd.h>intintgid)Системные вызовыи setgid(2) устанавливают сразу реальный и эф!фективный идентификаторы, а системные вызовыи setegid(2) —только эффективные.Ниже приведен фрагмент программыизменяющей идентификато!ры процесса на значения, полученные из записи файла паролей.