Операционная система UNIX
Шрифт:
Некоторые флаги, представленные в таблице, уже являются объединением нескольких флагов. Так, например, флаг
Для иллюстрации приведем небольшую программу, создающую файл с полными правами доступа для владельца, а затем изменяющую их. После каждой установки прав доступа в программе вызывается библиотечная функция system(3S), позволяющая запустить утилиту ls(1) и отобразить изменение прав доступа и дополнительных атрибутов.
В результате запуска программы на выполнение, получим следующий вывод:
Перемещение по файловой системе
Каждый процесс имеет два атрибута, связанных с файловой системой — корневой каталог (root directory) и текущий рабочий каталог (current working directory). Когда некоторый файл адресуется по имени (например, в системных вызовах open(2), creat(2) или readlink(2)), ядро системы производит поиск файла, начиная с корневого каталога, если имя файла задано как абсолютное, либо текущего каталога, если имя файла является относительным. Абсолютное имя файла начинается с символа '/', обозначающего корневой каталог. Все остальные имена файлов являются относительными. Например, имя /usr/bin/sh является абсолютным, в то время как mydir/test1.c или ../andy/mydir/test1.c — относительным, при котором фактическое расположение файла в файловой системе зависит от текущего каталога.
Процесс может изменить свой корневой каталог с помощью системного вызова chroot(2) или fchroot(2).
После этого поиск всех адресуемых файлов с абсолютными именами будет производиться, начиная с нового каталога, указанного аргументом
22
Изменение корневого каталога разрешено только для администратора системы — суперпользователя. Эта операция таит в себе определенную опасность, т.к. часть утилит операционной системы (если не все) могут оказаться недоступными, в том числе и команда chroot(1M). Таким образом, последствия необдуманного изменения корневого каталога могут стать необратимыми.
Изменение корневого каталога может потребоваться, например, при распаковке архива, созданного с абсолютными именами файла, в другом месте файловой системы, либо при работе над большим программным проектом, затрагивающим существенную часть корневой файловой системы. В этом случае для отладочной версии удобно создать собственную корневую иерархию.
Процесс
Например, внутренняя команда командного интерпретатора cd может быть реализована следующим кодом:
Метаданные файла
Как уже говорилось, каждый файл помимо собственно данных содержит метаданные, описывающие его характеристики, например, владельцев, права доступа, тип и размер файла, а также содержащие указатели на фактическое расположение данных файла. Метаданные файла хранятся в структуре inode. Часть полей этой структуры могут быть получены с помощью системных вызовов stat(2):
В качестве аргумента функции принимают имя файла или файловый дескриптор (fstat(2)) и возвращают заполненные поля структуры stat, которые приведены в табл. 2.15.
Таблица 2.15. Поля структуры stat
Поле | Значение |
---|---|
mode_t st_mode | Тип файла и права доступа |
ino_t st_ino | Номер inode. Поля st_ino и st_dev однозначно определяют обычные файлы |
dev_t st_dev | Номер устройства, на котором расположен файл (номер устройства файловой системы) |
dev_t st_rdev | Для специального файла устройства содержит номер устройства, адресуемого этим файлом |
nlink_t st_link | Число жестких связей |
uid_t st_uid | Идентификатор пользователя-владельца файла |
gid_t st_gid | Идентификатор группы-владельца файла |
off_t st_size | Размер файла в байтах. Для специальных файлов устройств это поле не определено |
time_t st_atime | Время последнего доступа к файлу |
time_t st_mtime | Время последней модификации данных файла |
time_t st_ctime | Время последней модификации метаданных файла |
long st_blksize | Оптимальный размер блока для операций ввода/вывода. Для специальных файлов устройств и каналов это поле не определено |
long st_blocks | Число размещенных 512-байтовых блоков хранения данных. Для специальных файлов устройств это поле не определено |