Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

Когда программа знает, что файлы те же самые, владение или права доступа могут быть изменены с помощью

fchown
или
fchmod
.

Эти системные вызовы, также как

lchown
, сравнительно недавние; [63] в старых системах Unix их не было, хотя в современных совместимых с POSIX системах они есть.

Соответствующих функций

futime
или
lutime
нет. В случае
futime
это (очевидно) потому, что временные отметки не являются критическими для безопасности системы в том же отношении, что для владения и прав доступа,
lutime
отсутствует потому, что временные отметки неуместны для символических ссылок.

63

fchown
и
fchmod
были введены в 4 2 BSD, но не включались в System V до выпуска 4 — Примеч. автора.

5.6. Резюме

• Иерархия файлов и каталогов, как она видится пользователю, является одним логическим деревом, корень которого находится в

/
. Оно составлено из одного или более разделов, каждый из которых содержит файловую систему. Внутри файловой системы в индексах хранятся данные о файлах (метаданные), включая размещение блоков данных.

• Каталоги осуществляют связь между именами файлов и индексами. Концептуально содержимое каталога, которое является просто последовательностью пар (индекс, имя). Каждый элемент каталога для файла называется (прямой) ссылкой, а файлы могут иметь множество ссылок. Прямые ссылки, поскольку они работают лишь по номеру индекса, все должны находиться в одной файловой системе. Символические ссылки являются указателями на файлы или каталоги и работают на основе имени файла, а не номера индекса, поэтому их использование не ограничено одной и той же файловой системой.

• Прямые ссылки создаются с помощью

link
, символические ссылки создаются с помощью
symlink
, ссылки удаляются с помощью
unlink
, а переименовываются файлы (с возможным перемещением в другой каталог) с помощью
rename
. Блоки данных файла не освобождаются до тех пор, пока счетчик ссылок не достигнет нуля и не закроется последний открытый дескриптор файла.

• Каталоги создаются с помощью

mkdir
, а удаляются с помощью
rmdir
; перед удалением каталог должен быть пустым (не оставлено ничего, кроме '
.
' и '
..
'). GNU/Linux версия функции ISO С
remove
вызывает соответствующие функции
unlink
или
rmdir
.

• Каталоги обрабатываются с помощью функций

opendir
,
readdir
,
rewinddir
и
closedir
.
struct dirent
содержит номер индекса и имя файла. Максимально переносимый код использует в члене
d_name
только имя файла. Функции BSD
telldir
и
seekdir
для сохранения и восстановления текущего положения в каталоге широко доступны, но не полностью переносимы, как другие функции работы с каталогами.

• Вспомогательные данные получаются с помощью семейства системных вызовов

stat
, структура
struct stat
содержит всю информацию о файле за исключением имени файла. (В самом деле, поскольку у файла может быть множество имен или он может совсем не иметь ссылок, невозможно сделать имя доступным.)

• Макрос

S_ISxxx
в
<sys/stat.h>
дает возможность определить тип файла. Функции
major
и
minor
из
<sys/sysmacros.h>
дают возможность расшифровки значений
dev_t
, представляющих
блочные и символьные устройства.

• Символические ссылки можно проверить, использовав

lstat
, а поле
st_size
структуры
struct stat
для символической ссылки возвращает число байтов, необходимых для размещения имени указываемого файла. Содержимое символической ссылки читают с помощью
readlink
. Нужно позаботиться о том, чтобы размер буфера был правильным и чтобы завершить полученное имя файла нулевым байтом, чтобы можно было его использовать в качестве строки С.

• Несколько разнообразных системных вызовов обновляют другие данные: семейство

chown
используется для смены владельца и группы, процедуры
chmod
для прав доступа к файлу, a
utime
для изменения значений времени доступа и изменения файла.

Упражнения

1. Напишите программу '

const char *fmt_mode(mode_t mode)
'. Ввод представляет собой значение
mode_t
, полученное из поля
st_mode
структуры
struct stat
; т.е. оно содержит как биты прав доступа, так и типа файла.

Вывод должен представлять строку в 10 символов, идентичную первому полю вывода '

ls -l
'. Другими словами, первый символ обозначает тип файла, а остальные девять — права доступа.

Когда установлены биты

S_ISUID
и
S_IXUSR
, используйте
s
вместо
x
; если установлен лишь бит
I_ISUID
, используйте
S
. То же относится к битам
S_ISGID
и
S_IXGRP
. Если установлены оба бита
S_ISVTX
и
S_IXOTH
, используйте
t
; для одного
S_ISVTX
используйте
T
.

Для простоты можете использовать статический (

static
) буфер, содержимое которого перезаписывается при каждом вызове процедуры.

2. Доработайте

ch05-catdir.c
, чтобы она вызывала
stat
для каждого найденного имени файла. Затем выведите номер индекса, результат вызова
fmt_mode
, число ссылок и имя файла.

3. Доработайте

ch05-catdir.c
так, что если файл является символической ссылкой, программа будет также выводить имя указываемого файла.

4. Добавьте такую опцию, что если имя файла является именем подкаталога, программа рекурсивно входит в него и отображает сведения о файлах (и каталогах) этого подкаталога. Необходим лишь один уровень рекурсии.

5. Если вы не работаете на системе GNU/Linux, запустите

ch05-trymkdir
(см. раздел 5.2 «Создание и удаление каталогов») на своей системе и сравните результаты с приведенными нами.

6. Напишите программу

mkdir
. Посмотрите свою локальную справочную страницу для mkdir(1) и реализуйте все ее опции.

7. В корневом каталоге,

/
, как номер устройства, так и номер индекса для '
.
' и '
..
' совпадают. Используя эту информацию, напишите программу
pwd
.

Вначале программа должна найти имя текущего каталога, прочитав содержимое родительского каталога. Затем она должна продолжить собирать сведения о иерархии файловой системы, пока не достигнет корневого каталога.

Отображение имени каталога в обратном порядке, от текущего каталога до корневого, легко. Как будет справляться ваша версия

pwd
с выводом имени каталога правильным образом, от корневого каталога вниз?

Поделиться:
Популярные книги

Последний Герой. Том 5

Дамиров Рафаэль
5. Последний герой
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Последний Герой. Том 5

Анти-Ксенонская Инициатива

Вайс Александр
7. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Анти-Ксенонская Инициатива

Матабар

Клеванский Кирилл Сергеевич
1. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар

Комбинация

Ланцов Михаил Алексеевич
2. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Комбинация

Петля, Кадетский корпус. Книга третья

Алексеев Евгений Артемович
3. Петля
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Петля, Кадетский корпус. Книга третья

Моя простая курортная жизнь 7

Блум М.
7. Моя простая курортная жизнь
Фантастика:
дорама
гаремник
5.00
рейтинг книги
Моя простая курортная жизнь 7

Я еще князь. Книга XX

Дрейк Сириус
20. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще князь. Книга XX

Неудержимый. Книга XXVII

Боярский Андрей
27. Неудержимый
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга XXVII

Беглец

Бубела Олег Николаевич
1. Совсем не герой
Фантастика:
фэнтези
попаданцы
8.94
рейтинг книги
Беглец

Чужак из ниоткуда 4

Евтушенко Алексей Анатольевич
4. Чужак из ниоткуда
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужак из ниоткуда 4

Монстр из прошлого тысячелетия

Еслер Андрей
5. Соприкосновение миров
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Монстр из прошлого тысячелетия

Deus vult

Зот Бакалавр
9. Герой Империи
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Deus vult

Отмороженный

Гарцевич Евгений Александрович
1. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный

Диверсант

Вайс Александр
2. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Диверсант